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

标签 mfc cdialog com-server

我有一个模块,可以创建包含 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/

相关文章:

python - _com_interfaces_ 有什么作用?

c++ - CMFCToolBar ComboBoxEdit 句柄删除按钮

c++ - VC6转VS2008时try catch报错

c++ - hwnd 设置高位是否正常?

c++ - 如何在另一个 CDialog 中显示嵌套的 CDialog?

c# - COM 服务器 C#(在 x64 应用程序中使用 x86 dll)

Python COM 服务器抛出 'module' 对象没有属性 'VARIANT'

c++ - 在 MFC 对话框应用程序中检查系统时间 24/7

c++ - 在运行时更改对话框中的静态文本

c++ - 带有 IWebBrowser 组件的 CDialog,退格键不起作用