gpt4 book ai didi

mfc - 对于带有 ActiveX 控件的对话框,CDialog::Create 失败

转载 作者:行者123 更新时间:2023-12-02 00:54:12 26 4
gpt4 key购买 nike

我有一个模块,可以创建包含 ActiveX 控件的无模式对话框。该模块是 MFC EXE 应用程序的一部分,对话框的创建工作正常。最近,我将模块移出到 ATL/COM 服务器中,并将对话框资源从 EXE 复制到 COM 服务器中。当尝试使用 CDialog::Create() 创建无模式对话框时,会发生错误。

我调试到CDialog::Create并注意到它在::CreateDialogIndirect()中失败,返回NULLGetLastError 返回0。我在对话框资源属性中将“无失败创建”标志更改为 True,并获得了有关错误的更多详细信息。问题发生在对话框的 DDX_Control 宏内的 DoDataExchange() 中。这将使用控件的资源 ID 调用 CDataExchange::PrepareCtrl(),如下所示:

HWND CDataExchange::PrepareCtrl(int nIDC)
{
ASSERT(nIDC != 0);
ASSERT(nIDC != -1); // not allowed
HWND hWndCtrl;
COleControlSite* pSite = NULL;
m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
if (hWndCtrl == NULL)
{
// Could be a windowless OCX
pSite = m_pDlgWnd->GetOleControlSite(nIDC);
if (pSite == NULL)
{
TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
}
m_idLastControl = nIDC;
m_bEditLastControl = FALSE; // not an edit item by default

return hWndCtrl;
}

由于所传递的资源 ID,对函数 m_pDlgWnd->GetOleControlSite() 的调用失败。顺便说一句,资源 ID 是控件的 ID。

关于为什么它在 EXE 中有效但在 COM 服务器中失败的原因有什么建议吗?

最佳答案

我遇到了完全相同的问题。就我而言,问题是我没有调用 AfxEnableControlContainer()。我在应用程序的 InitInstance 成员函数中添加了对此的调用,它解决了问题。

关于mfc - 对于带有 ActiveX 控件的对话框,CDialog::Create 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com