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

我调试了CDialog::Create,发现它在::CreateDialogIndirect()中失败,它返回了NULL,而GetLastError返回了0。我在对话框资源属性中将“No Fail Create”标志设置为True,并获得了更多有关该错误的详细信息。该问题发生在DoDataExchange()宏中对话框的DDX_Control中。这将使用控件的资源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成员函数中添加了对此的调用,它解决了该问题。

09-10 04:58
查看更多