c++ - MFC扩展dll资源加载问题

标签 c++ dll mfc dialog afx

我已经构建了以下配置:

  • A) 具有 2 个 MFC 对话框的 MFC 扩展 DLL。
  • B) 使用 DLL A 函数的 MFC 常规 dll。
  • C) win32 应用程序 (NON MFC) 从 DLL B 调用函数

当调用 DLL B 的函数时,内部调用 DLL A 的函数以显示对话框,由于无法找到资源而发生错误。

我已深入挖掘以找到确切的根本原因,主要的原因似乎是模块上下文设置为调用 dll B 而不是 DLL A,后者包含对话框资源。

在 DllMain 内部,初始化按照 MSDN 中的描述完成:

static AFX_EXTENSION_MODULE NEAR extensionDLL = { NULL, NULL };

extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{   
   if (dwReason == DLL_PROCESS_ATTACH)
   {      
       Hinstance = hInstance;  //save instance for later reuse
      // Extension DLL one-time initialization
      if (AfxInitExtensionModule(extensionDLL,hInstance) == 0)
      {
          AfxMessageBox("Error on init AfxInitExtensionModule!");
          return 0;
      }
      // Insert this DLL into the resource chain
      new CDynLinkLibrary(extensionDLL);
   }
   else if (dwReason == DLL_PROCESS_DETACH)
   {
       Release();
   }
   return 1;
}

我发现的一个解决方法是存储从 DLLMain 接收的 hInstance 参数:extern "C"int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason , LPVOID lpReserved) 在 DLL A 中调用函数时,我保存当前句柄并将新句柄设置为从 DllMain 收到的句柄:

DLL A function1(............)
{
    HINSTANCE HinstanceOld = AfxGetResourceHandle(); 
    AfxSetResourceHandle(CErrohInstance); 
    .......
    //display dialog
    .....
    AfxSetResourceHandle(HinstanceOld);
}

通过使用这个 workarround 它仍然会导致断言,但会显示对话框。

解决这个问题的正常方法应该是什么?

最佳答案

您必须将扩展 DLL 的资源插入到常规 DLL 的资源链中,而不是 EXE。只需在扩展 DLL 中创建一个函数并在常规 DLL 的 InitInstance 方法中调用它,如下所示:

void initDLL()
{
  new CDynLinkLibrary(extensionDLL);
}

关于c++ - MFC扩展dll资源加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11517439/

相关文章:

c++ - MFC EditControl 的值不在私有(private)成员中

c++ - OpenGL:多种渲染方法..什么时候使用哪种?

c++ - 函数包装避免重复

c# - 在 C# 中运行的应用程序之间共享变量

C++ MFC SDI 创建子窗口

c++ - 使用 MFC 的表/网格

c++ - 在 C++ 中,如何生成介于两个范围之间的随机数?

C++ Win32 窗口背景不重绘

python - 我试图用 python ctypes 打开一个用 c 编写的 dll 并运行其中的函数,但它是一个字符,而不是字符串

java - DLL 中函数的名称是什么?