为什么会发生应用程序无法启动的情况?

我把一个exe程序改写成了dll(我在VS中将输出改成了dll,并且把主函数改成了借口也导出了),然后用一个exe去调用dll为啥会报错?

img


就是说,如果不屏蔽的话,会变成导入,这是为什么?

img


这是实现。
错误如下

img

可能是因为你在将 exe 改写成 dll 的过程中,没有正确处理好 exe 中的入口函数和 dll 中的导出函数。

在 exe 中,入口函数一般是 main 或者 wmain,而在 dll 中,你需要把主函数改写成一个导出函数,并使用 __declspec(dllexport) 来导出。

例如:

// exe 中的入口函数
int main(int argc, char* argv[])
{
// 其他代码
return 0;
}

// dll 中的导出函数
__declspec(dllexport) int main(int argc, char* argv[])
{
// 其他代码
return 0;
}

如果你的 exe 中有多个入口函数,则需要把所有入口函数都改写成导出函数。

另外,你还需要注意 dll 的命名规范,比如说 dll 的文件名、函数名和符号名等。

如果你还是遇到了问题,可以尝试使用 Dependency Walker 工具来检查 dll 和 exe 的依赖关系,帮助你找到问题的原因。

调用 DLL 中的函数有几种方式,如下所示:

1、使用 LoadLibrary 和 GetProcAddress 函数
2、使用 MFC 的 AfxLoadLibrary 和 GetProcAddress 函数
3、使用 __declspec(dllimport)
如果你使用的是第 3 种方式,你需要在调用 DLL 中函数的地方添加 __declspec(dllimport) 声明。

例如:

__declspec(dllimport) int Add(int a, int b);

如果你使用的是第 1 或第 2 种方式,你可以使用 Win32 API 函数 LoadLibrary 和 GetProcAddress 来加载 DLL 并调用 DLL 中的函数。

例如:

HMODULE hModule = LoadLibrary(L"mydll.dll");
if (hModule != NULL)
{
typedef int (*pfnAdd)(int a, int b);
pfnAdd pAdd = (pfnAdd)GetProcAddress(hModule, "Add");
if (pAdd != NULL)
{
int c = pAdd(1, 2);
// 调用 DLL 中的 Add 函数
}
FreeLibrary(hModule);
}

如果你在调用 DLL 中的函数时出现了错误,可以尝试检查 DLL 文件是否存在、是否可以正常加载、函数名是否正确等。

你只是给出了报错的表现,你需要看的是报错的具体情况,要看报错日志或具体的报错提示。

调用的代码在哪呢,我只看到了声明,没有看到调用啊
你不应该在main函数里调用吗

在改写 exe 为 dll 时,除了更改输出类型和把主函数改为接口并导出之外,还需要考虑其他一些问题。

例如:

如果 exe 中使用了静态变量,那么在 dll 中就要使用 __declspec(dllexport) 来修饰,否则会被认为是 exe 中的私有数据。
如果 exe 和 dll 使用了不同的 C++ 库(例如 exe 使用的是 MFC 库,而 dll 使用的是 STL 库),那么 exe 和 dll 之间就不能直接调用。
另外,如果您在调用 dll 时遇到问题,可以使用 GetLastError 函数来获取错误信息,以便进一步定位问题。


有可能原因就是win10不兼容中文版的vc,解决方法就是一句话,用英文版的msdev.exe替换中文版的msdev.exe,msdev.exe是vc的启动程序

从报错来看,大概思路是:
1、exe程序改写成了dll文件错误,也就是源文件错误
2、exe去调用dll文件错误,也就是调用方式错误,识别失败