我试图在DLL中隐藏WinMain函数,以避免反复输入大部分代码。
我通过将其声明为
从DLL导出wWinMain
extern "C" int WINAPI wWinMain( ... )
{
// repetitive code here
}
并使用链接器选项/EXPORT:wWinMain
,但当我尝试在另一个项目中使用导入库时,我收到错误
LIBCMTD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function __tmainCRTStartup
备注我确实想使用GUI界面,我知道在定义main而不是WinMain函数时这是常见错误。此外,我在两个项目中启用了UNICODE支持。我该怎么办?
答案 0 :(得分:2)
这是不可能的,链接器只能将EXE的入口点设置为EXE内部的函数。将DLL中的wWinMain()重命名为其他内容。将wWinMain()写入链接到EXE的源代码文件中,只需调用DLL的导出函数。
答案 1 :(得分:0)
你应该在DLL中使用WinMain吗?它应该不是DllMain吗?
答案 2 :(得分:0)
如果你想调用dll的WinMain,你需要替换CRTWinMainStartup函数(你喜欢的CRT lib中的_tmainCRTStartup),并让它调用你导出的WinMain,这会阻止链接器寻找本地WinMain并仍然保持正确的程序流程(CRT初创公司的源代码应该在任何编译器的crt源代码中)
答案 3 :(得分:0)
我找到了一种将WinMain放入DLL中的方法。
将def文件附加到项目中,然后,
在def文件中附加 EXPORTS WinMain 。
喜欢这个
EXPORTS
的WinMain
从观察中,所有需要导出的函数都生成,而不仅仅是WinMain。
经过测试, __ declspec(dllexport)的方式对WinMain无效。
答案 4 :(得分:0)
EXPORT int WINAPI _WinMain_(int (*_main_)(int argc, char **argv), HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR commandLine, int nCmdShow);
int _XMain( int argc, char **argv );
#define XMain WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR commandLine, int nCmdShow)\
{return _WinMain_( _XMain, hInst, hPrevInstance, commandLine, nCmdShow );} \
int _XMain
然后_WinMain_()
来电或安排_XMain()
。
在您的申请来源中:
int XMain( int argc, char **argv )
{
}
答案 5 :(得分:0)
// ...somewhere in a .cpp file within my .dll's sources...
#define WinMain WinMainOld // ...to suppress Win32 declaration of WinMain
#include <windows.h>
#undef WinMain // ...so that WinMain below is not replaced
. . .
#pragma comment(linker, "/export:_WinMain@16") // ...to export it from .dll
extern "C" // ...to suppress C++ name decoration
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR pCmdLine, int nCmdShow)
{
. . .
}