动态库利用主程序传递的窗口句柄创建子对话框

目标实现在一个单文档视图View里创建一个tabcontrol,然后在动态库中实现各种自定义界面,在view里调用动态库接口,并传递主程序窗口指针,
在动态库中如何使用主程序传递的窗口句柄来为其创建一个子对话框呢? 现在使用这个指针能够给主程序传递消息,但在cdialog::create(IDD_X,parentWindow)这一步崩溃

引用 皆我百晓生 小程序回复内容作答:
在动态库中使用主程序传递的窗口句柄创建子对话框,您可以按照以下步骤进行操作:

  1. 在主程序中,调用动态库接口时,将主程序窗口的句柄作为参数传递给动态库的函数。

  2. 在动态库中的函数内部,保存主程序传递的窗口句柄。

  3. 在动态库的函数内部,使用保存的窗口句柄创建子对话框。可以通过调用CDialog::Create()函数来实现。

下面是一种可能的实现方式:

// 在动态库的头文件中定义一个指向主窗口的指针变量
CWnd* g_pParentWnd;

// 在动态库的函数中保存主窗口的句柄
void SetParentWindow(CWnd* pParentWnd)
{
    g_pParentWnd = pParentWnd;
}

// 在动态库的函数中使用主程序传递的窗口句柄创建子对话框
void CreateChildDialog()
{
    CDialog dlg;
    dlg.Create(IDD_X, g_pParentWnd);
    // 其他对话框相关操作...
}

在主程序中调用动态库函数并传递窗口句柄:

// 在主程序中调用动态库函数,并传递窗口句柄
CWnd* pMainWnd = AfxGetMainWnd();
SetParentWindow(pMainWnd);
CreateChildDialog();

请注意,确保主程序的窗口句柄在动态库中有效。如果在调用cdialog::create(IDD_X, parentWindow)时出现崩溃,可能是因为窗口句柄无效或者资源ID为IDD_X的对话框资源不存在。

【以下回答由 GPT 生成】

问题解答:

首先,要使用主程序传递的窗口句柄创建子对话框,你需要采取以下步骤:

  1. 在主程序中获取主窗口的句柄。
HWND parentWindow = ::GetActiveWindow();  // 获取当前活动窗口句柄
  1. 将窗口句柄传递给子对话框的创建函数。假设你的子对话框类名为 CSubDialog,那么你可以这样创建子对话框:
CSubDialog subDialog;
subDialog.Create(IDD_X, CWnd::FromHandle(parentWindow));

这将创建子对话框,并将主窗口句柄作为父窗口句柄传递给子对话框。IDD_X 是你的子对话框模板资源ID。

  1. 确保子对话框类的 OnInitDialog 函数中使用正确的对话框模板资源ID。
BOOL CSubDialog::OnInitDialog()
{
    if (!CDialogEx::OnInitDialog())
        return FALSE;

    // 确保使用正确的对话框模板资源ID
    if (!SetDialogID(IDD_X))
    {
        // 错误处理
        AfxMessageBox(_T("无效的对话框模板ID"));
        return FALSE;
    }

    // TODO: 添加额外的初始化代码

    return TRUE;
}

这可以确保子对话框使用正确的对话框模板资源ID。

通过以上步骤,你应该能够成功创建一个通过主程序传递的窗口句柄创建的子对话框。

完整示例代码如下:

HWND parentWindow = ::GetActiveWindow();  // 获取主窗口句柄

CSubDialog subDialog;
subDialog.Create(IDD_X, CWnd::FromHandle(parentWindow));  // 创建子对话框

// 将子对话框作为主窗口的子窗口显示
subDialog.ShowWindow(SW_SHOW);

请注意根据你的实际需求修改代码中的窗口句柄和对话框资源ID。如果你仍然遇到问题,请提供更多的细节,以便我可以更好地帮助你。

希望这对你有帮助!如果你对这个问题还有其他疑问,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

主要问题是:你的操作对系统是安全的么?如果这种操作会引发系统风险,那么想要绕开系统监管策略的任何努力应该都是行不通的。我劝你还是放弃了吧。如果坚持要测试出个系统漏洞,那也该换个测试方案啦……