将Windows消息循环封装到DLL中

时间:2009-07-21 00:10:25

标签: 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;

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

}

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

这种安排是否有明确的解决方案?

2 个答案:

答案 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;
}