将 Windows 消息循环封装到 DLL 中

Rub*_*oso 5 c++ dll winapi

我想要一个带有窗口创建和管理代码的 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();
}
Run Code Online (Sandbox Code Playgroud)

在 DLL 端,代码应该如下所示

void (*main)() = NULL;

int WinMain(...) {
   if(main)
       main(); // call the user defined funcion
   while(!done) {
       if(messageWaiting()) {
           processMessage();
       }
   }

}
Run Code Online (Sandbox Code Playgroud)

为什么?因为我想部署一个窗口包装器并避免让用户编写 WinMain 入口点。但是 DLL 项目有一个 DLL main 和一个 win32 项目,如果链接器没有找到 winMain 入口点,则该项目使用 DLL complaim。

这种安排有已知的解决方案吗?

小智 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 );
}
Run Code Online (Sandbox Code Playgroud)

代码简单,容易编写。DLL 用户不需要付出太多努力。您可以完全控制消息循环(以及整个进程生命周期)。