对话框中的ActiveX控件的调用问题VC6下面的基于对话框的MFC程序。我用的ActiveX控件是MSFlexGrid,我是通过appwizard生成一个.exe的app工程,对于控件的引用是从Porject->Add to Project->compnents and controls加入,然后在资源编辑器中把控件拖入到对话框上。然后在对话框类中加入变量(CMSFlexGrid m_ctlFlexGrid)于此控件关联。在对话框中我还新建了一个静态变量,它是控件MSFlexGrid的句柄(m_hFlexGrid),在对话框的OnInitDialog中对句柄进行赋值。
有另外一个线程,它根据这个静态句柄对控件进行操作:CMSFlexGrid *pWnd = static_cast<CMSFlexGrid*>(CWnd::FromHandle(m_hFlexGrid));
ASSERT(pWnd && ::IsWindow(pWnd->m_hWnd));
pWnd->AddItem(/*省略*/); // 此句触发下面所示断言void AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
void* pvRet, const BYTE* pbParamInfo, ...)
{
ASSERT(m_pCtrlSite != NULL);    // not an OLE control (not yet, at least)
}
我已经在C***App::InitInstance里面调用AfxEnableControlContainer()了。我该怎么做?各位大虾帮忙呀!救命呀!!!

解决方案 »

  1.   

    看看是不是:
    应用程序支持ActiveX 
    初始化的时候AfxEnableControlContainer();
    add #include "afxdisp.h" in the stdafx.h file
      

  2.   

    CWnd::FromHandle返回的是CTempWnd类的指针
    你需要列集你的操作,例如发消息到主线程去操作FlexGrid
      

  3.   

    在对话框的OnInitDialog中对句柄进行赋值。
    有另外一个线程,它根据这个静态句柄对控件进行操作:CMSFlexGrid *pWnd = static_cast<CMSFlexGrid*>(CWnd::FromHandle(m_hFlexGrid));
    ASSERT(pWnd && ::IsWindow(pWnd->m_hWnd));
    pWnd->AddItem(/*省略*/); // 此句触发下面所示断言
    估计时机不对,可能这时控件没有创建,主要指在线程中的操作。
      

  4.   

    to  jiangsheng:"列集"操作?这个好像是com里面的概念呀。这个是activeX控件呀,我怎么知道AddItem对应的是哪个消息,以及消息的参数怎么设呀。能给我写点例程么,谢谢了
      

  5.   

    ……ActiveX控件就是COM组件……COM组件不是用消息来操作的。
    线程中访问其他线程创建的CWnd派生类对象会有不可预料的结果,例如应用程序崩溃等等。
    关于句柄和窗口对象的关系,你可以去看
    http://dev.csdn.net/article/23/23171.shtm
    可以用Windows的消息机制来列集操作。