C++ 将Windows消息循环封装到DLL中
我希望有一个带有窗口创建和管理代码的DLL,开发人员只需添加一个名为main.h的头并加载DLL即可实例窗口C++ 将Windows消息循环封装到DLL中,c++,winapi,dll,C++,Winapi,Dll,我希望有一个带有窗口创建和管理代码的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; in
#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平面
对于这种排列,是否有已知的解决方案?每个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用户来说,这不需要太多的努力。您可以完全控制消息循环(以及整个进程生命周期)。您不能在单独的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;
}