我希望有一个带窗口创建和管理代码的DLL,开发人员只需添加一个命名的main.h头并加载DLL即可实例化一个窗口。
#include "dllheader.h"
void user_main();
main = user_main; // attach user main to the dll callback
int user_main() {
Window *w = new Window();
}
在DLL端,代码看起来应该是
void (*main)() = NULL;
int WinMain(...) {
if(main)
main(); // call the user defined funcion
while(!done) {
if(messageWaiting()) {
processMessage();
}
}
}
为什么呢?因为我想部署一个窗口包装器,并避免让用户写入WinMain入口点。但是DLL项目有一个DLL main和一个win32项目,如果链接器找不到winMain入口点,它会使用DLL抱怨。
这种安排是否有明确的解决方案?
答案 0 :(得分:3)
每个Win32应用程序都必须有一个入口点(通常是WinMain)。因此,您不能将入口点放在DLL中,因为它实际上不是EXE的一部分。但是,入口点可以位于静态链接库中。当静态库被链接时,入口点将成为EXE的一部分。
但我的建议是避免所有这些复杂性。只需让你的DLL用户调用这样的东西:
int WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow )
{
return WrapperDllMain( hInstance, hPrev, lpCmdLine, nCmdShow, &user_main );
}
代码简单易写。 DLL用户并没有太多的努力。您可以完全控制消息循环(以及整个过程生命周期)。
答案 1 :(得分:1)
您无法在单独的DLL中实现应用程序的WinMain()入口点。应用程序必须实现自己的入口点,否则链接器会抱怨,正如您已经发现的那样。应用程序的入口点可以调用DLL中的函数,即:
--- app ---
#include "dllheader.h"
int user_main()
{
...
}
int WinMain(...)
{
return dll_main(&user_main);
}
--- dll ---
int dll_main(void (*user_main)())
{
if(user_main)
user_main(); // call the user defined funcion
while(!done)
{
if(messageWaiting())
{
processMessage();
}
}
return 0;
}