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

use*_*114 5 mfc cdialog com-server

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

我调试到CDialog::Create并注意到它的失败,::CreateDialogIndirect()返回NULLGetLastError回报0。我在对话框资源属性中将“ No Fail Create”标志设置为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;
}
Run Code Online (Sandbox Code Playgroud)

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

关于为什么它在EXE内有效而在COM服务器上失败的任何建议?

cha*_*cha 2

前几天也遇到了类似的问题。将控件从一个对话框资源复制到另一个对话框资源。事实上,您不能像处理其他 MFC 控件那样将 ActiveX 控件从一个对话框复制到另一个对话框。对于 ActiveX 控件,rc 文件包含 DLGINIT 部分。例如,我有一个带有 IE WebBrowser 控件的表单:

IDD_ONLINE_REPORTVIEW_FORM DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_CONTROL | WS_CHILD
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
    CONTROL         "",IDC_EXPLORER1,"{8856F961-340A-11D0-A96B-00C04FD705A2}",WS_TABSTOP,7,61,299,77
END
Run Code Online (Sandbox Code Playgroud)

在 rc 文件的下面,有一个 DLGINIT 部分:

IDD_ONLINE_REPORTVIEW_FORM DLGINIT
BEGIN
    IDC_EXPLORER1, 0x376, 160, 0
0x0000, 0x0000, 0x004c, 0x0000, 0x2e68, 0x0000, 0x0ceb, 0x0000, 0x0000, 
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
0x0000, 0x0000, 0x004c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 
0x0000, 0xd0e0, 0x0057, 0x3573, 0x11cf, 0x69ae, 0x0008, 0x2e2b, 0x6212, 
0x0008, 0x0000, 0x0000, 0x0000, 0x004c, 0x0000, 0x1401, 0x0002, 0x0000, 
0x0000, 0x00c0, 0x0000, 0x0000, 0x4600, 0x0080, 0x0000, 0x0000, 0x0000, 
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
    0
END
Run Code Online (Sandbox Code Playgroud)

打开 rc 文件的源代码并搜索您的控件 ID。搜索 DLGINIT 部分并将其复制到新对话框中