Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将Windows消息循环封装到DLL中_C++_Winapi_Dll - Fatal编程技术网

C++ 将Windows消息循环封装到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

我希望有一个带有窗口创建和管理代码的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平面


对于这种排列,是否有已知的解决方案?

每个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;
}