从 DLL 导出的 WinMain
我试图将 WinMain 函数隐藏在 DLL 中,以避免一遍又一遍地再次输入大部分代码。
从 DLL 导出
我通过将 wWinMain 声明为extern "C" int WINAPI wWinMain( ... ) { // 这里重复代码 }
并使用了链接器选项 /EXPORT:wWinMain
,但是当我尝试在另一个项目中使用导入库时,出现错误
LIBCMTD.lib(wincrt0.obj) : 错误 LNK2019: 无法解析的外部符号 _WinMain@16 在函数 __tmainCRTStartup 中引用
备注我确实想使用 GUI 界面并且我知道当您定义 main 而不是 WinMain 函数时这是常见错误。另外,我在这两个项目中都启用了 UNICODE 支持。我应该怎么办?
I am trying to hide the WinMain function inside a DLL in order to avoid typing again much of the code over and over again.
I exported wWinMain from the DLL by declaring it as
extern "C" int WINAPI wWinMain( ... )
{
// repetitive code here
}
and used the linker option /EXPORT:wWinMain
, but when I try to use the import library in another project I get the error
LIBCMTD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function __tmainCRTStartup
Remark I do want to use the GUI interface and I know this is common error when you define a main instead of a WinMain function. Also, I enabled the UNICODE support in both projects. What should I do?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
按原样这是不可能的,链接器只能将 EXE 的入口点设置为 EXE 内部的函数。将 DLL 中的 wWinMain() 重命名为其他名称。在链接到 EXE 的源代码文件中编写 wWinMain(),只需调用 DLL 的导出函数即可。
This is not possible as-is, the linker can only set the entrypoint for an EXE to a function that's inside the EXE. Rename the wWinMain() in the DLL to something else. Write a wWinMain() in a source code file that gets linked into your EXE, simply call the DLL's exported function.
您应该在 DLL 中使用 WinMain 吗?不应该是DllMain吗?
Should you be using WinMain in a DLL? Should it not be DllMain?
如果你想调用dll的WinMain,你需要替换CRTWinMainStartup函数(你喜欢的CRT库中的_tmainCRTStartup),并让它调用你导出的WinMain,这会阻止链接器寻找本地WinMain并仍然保持正确的流程程序(CRT 启动的源代码应该位于任何编译器的 crt 源代码中)
If you want to call the WinMain of the dll, you need to replace the CRTWinMainStartup function(_tmainCRTStartup in your liked CRT lib), and make it call your exported WinMain, this stops the linker looking for a local WinMain and still keeps correct flow of the program(the source for the CRT startups should be in the crt source of any compiler)
我找到了一种将 WinMain 放入 DLL 中的方法。
将 def 文件附加到您的项目中,
在 def 文件中附加EXPORTS WinMain。
像这样
<块引用>
出口
<块引用>
WinMain
从观察来看,所有的导出函数都需要生成,不仅仅是WinMain。
经测试,__declspec(dllexport)方式对于WinMain无效。
使用#pragma comment(lib, "testDll.lib")
或者修改项目中的设置。
I find one way to put WinMain inside DLL.
Append a def file into your project and,
append EXPORTS WinMain in def file.
Like this
From the observation, all need exported functions generated, not only WinMain.
After test, the way of __declspec(dllexport) is invalid for WinMain.
use #pragma comment(lib, "testDll.lib")
or modify setting in the project.
然后
_WinMain_()
调用或调度_XMain()
。在您的应用程序源中:
Then
_WinMain_()
calls or schedules_XMain()
.Over in your application source: