从 DLL 创建和加载对话框

Posted

技术标签:

【中文标题】从 DLL 创建和加载对话框【英文标题】:Creating and Loading DialogBox from DLL 【发布时间】:2013-02-19 10:57:15 【问题描述】:

我在 Win32 DLL(使用资源编辑器)中创建了一个对话框,现在想在应用程序(使用该 DLL)调用 DisplayDialog 时显示它,但它不起作用。

// AppProgram.cpp
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

  switch (msg) 
    case WM_COMMAND:
      switch (LOWORD (wParam)) 
          case IDM_FILE_NEW_DIALOG:
              DisplayDialog (hInst, hWnd);
              break;
          ...
      
      break;
      ....
  
 return DefWindowProc(hWnd, msg, wParam, lParam);

我的 DLL 看起来像

#include "stdafx.h"
#include "myDLL.h"

EXPORT BOOL CALLBACK DisplayDialog (HINSTANCE hInst, HWND hWnd) 
   DialogBox (hInst, MAKEINTRESOURCE (IDD_DIALOG1), hWnd, reinterpret_cast<DLGPROC> (DiagProc));
   // MessageBox works here

...

如果对话框属于 AppProgram,我已经测试过该 DLL 显示对话框。 在这里,我想在它是 DLL 的一部分时显示对话框。

请建议我们是应该在 DLL 中创建对话框还是应该从程序中传递它。 + 如何在给定场景中显示对话框。提前致谢。

【问题讨论】:

【参考方案1】:

hInst 参数是包含对话框资源的模块的句柄。如果您想从 DL 的资源中获取对话框,则将句柄传递给 DLL,而不是将句柄传递给主应用程序。

【讨论】:

【参考方案2】:

类似这样的:

HMODULE module  = LoadLibrary("MyDll.dll");
HRSRC res = FindResource(module, "#1234", RT_DIALOG);
DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)LoadResource(module, res);
DialogBoxIndirect(0, pTemplate, hwnd, dlgproc);

【讨论】:

GetDlgItem(hWnd, IDC_EDIT_FNAME) 在 WM_INITDIALOG 中运行良好,但在 WM_COMMAND 中返回 0x00000000,请告诉我为什么它在 WM_COMMAND 中无法正常运行。 @ajay - 这是另一个问题。

以上是关于从 DLL 创建和加载对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 mfc dll 加载 ActiveX dll

从附属 DLL 加载“特殊”MFC 控件

如何在Visual C ++中创建一个包含对话框的dll(对于Windows应用程序为Dll)[关闭]

从另一个 DLL 加载 MFC 应用程序对话框

MFC如何调用DLL(VC++)

模块*.DLL 加载失败。请确保该二进制储存在路径中,或者调试它以检查该二进制或相关的.DLL文件是不是有问题