我有一个模块,可以创建包含 ActiveX 控件的无模式对话框。该模块是 MFC EXE 应用程序的一部分,对话框的创建工作正常。最近,我将模块移出到 ATL/COM 服务器中,并将对话框资源从 EXE 复制到 COM 服务器中。当尝试使用创建无模式对话框时CDialog::Create()
发生错误。
我调试到CDialog::Create
并注意到它失败了::CreateDialogIndirect()
返回NULL
and GetLastError
回报0
。我在对话框资源属性中将“无失败创建”标志更改为 True,并获得了有关错误的更多详细信息。问题发生在对话框中DoDataExchange()
内DDX_Control
宏。这会调用CDataExchange::PrepareCtrl()
控件的资源 ID 如下:
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;
}
对函数的调用m_pDlgWnd->GetOleControlSite()
对于传递的资源 ID 失败。顺便说一句,资源 ID 是控件的 ID。
关于为什么这在 EXE 中有效但在 COM 服务器中失败的原因有什么建议吗?
我有完全相同的问题。就我而言,问题是我没有调用 AfxEnableControlContainer()。我在应用程序的 InitInstance 成员函数中添加了对此的调用,它解决了问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)