WinMain从DLL导出

时间:2010-12-27 16:31:22

标签: winapi linker-errors dllexport winmain

我试图在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支持。我该怎么办?

6 个答案:

答案 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中的方法。

  • 你需要使用WinMain而不是wWinMain(我不知道为什么)
  • 将def文件附加到项目中,然后,
    在def文件中附加 EXPORTS WinMain 。 喜欢这个

      

    EXPORTS

         
        

    的WinMain

      

    从观察中,所有需要导出的函数都生成,而不仅仅是WinMain。

    经过测试, __ declspec(dllexport)的方式对WinMain无效。

  • 将程序链接到DLL库 使用 #pragma comment(lib,“testDll.lib”) 或者修改项目中的设置。

答案 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)
{
    .   .   .
}