用appwizard创建一个ActiveX控件,里面创建一个对话框,在一个接口方法中打开对话框,Domodal(),编译通过。
然后用appwizard创建一个App程序,调用这个方法,想把对话框打开,结果出现ASSERT错误。具体如下:
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) if (m_pCtrlSite == NULL)
return; va_list argList;
va_start(argList, pbParamInfo);
m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,
argList);
va_end(argList);
}
错误出现在第一行,由于刚刚接触ActiveX,不知道有人碰到过这种情况吗?
谢谢!

解决方案 »

  1.   

    引入Dialog技术 
    ---- 下面介绍在制作ActiveX控件时引入有模式对话框技术,制作步骤如下: 创建一新的MFC ActiveX ControlWizard项目,取名为Hello,其他用缺省选项;在ResourceView页中新增一对话框资源,命名为IDD_HELLODIALOG,可以在对话框上放自己的控件;为对话框资源IDD_HELLODIALOG创建新类CHelloDialog,从CDialog继承;确认在HelloCtrl.h中已加入语句#include "HelloDialog.h",为CHelloCtrl类添加成员变量CHelloDialog m_helloDialog;用ClassWizard在Automation页中为CHelloCtrl添加一方法void DoHello(),外部名亦为DoHello; 
    void CHelloCtrl::DoHello() 
    {
    // 显示对话框
    m_helloDialog.DoModal();
    }---- 可以用ActiveX Control Test Container测试Hello Control的DoHello方法。 ---- 下面介绍在制作ActiveX控件时引入无模式对话框技术,制作步骤如下: 在上面工作的基础上,用ClassWizard为CHelloCtrl添加WM_CREATE的处理函数OnCreate,在此创建无模式对话框;修改DoHello代码,在此显示对话框; 
    int CHelloCtrl::OnCreate
    (LPCREATESTRUCT lpCreateStruct) 
    {
    if (COleControl::OnCreate(lpCreateStruct) == -1)
    return -1;

    // 创建对话框
    m_helloDialog.Create(IDD_HELLODIALOG);return 0;
    }void CHelloCtrl::DoHello() {
    // 显示对话框
    m_helloDialog.ShowWindow(SW_SHOW);
    }
    ---- 下面介绍制作以对话框作为界面的ActiveX控件技术,制作步骤如下: 在上面工作的基础上,设置对话框资源IDD_HELLODIALOG属性的Style页为Style:Child、Border:Dialog Frame、Title Bar:unchecked;设置More Style页为Visible:checked;Control:checked;设置Extended Styles页为Static Edge:checked;在CHelloCtrl::OnCreate中写入m_helloDialog.Create(IDD_HELLODIALOG,this)语句;在CHelloCtrl::OnDraw中写入m_helloDialog.MoveWindow(rcBounds,TRUE); 
    int CHelloCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (COleControl::OnCreate(lpCreateStruct) == -1)
    return -1;

    // 创建对话框
    m_helloDialog.Create(IDD_HELLODIALOG,this);

    return 0;
    }void CHelloCtrl::OnDraw(CDC* pdc, const
     CRect& rcBounds, const CRect& rcInvalid)
    {
    // 定位Hello对话框
    m_helloDialog.MoveWindow(rcBounds,TRUE);
    }
      

  2.   

    楼主是通过向导借助类型库的类型信息生成MFC包装类来生成那个控件的实例吗?
    任何一个ActiveX控件都需要一个容器站点(提供IOleControlSite等接口)来包容,楼主在通过CWnd::CreateControl传进去的父窗口指针将作为容器站点的提供者,m_pCtrlSite就是存放着那个容器站点的指针的。
    断言失败,说明这个控件的容器站点指针没有初始化,楼主可检查一下控件的创建过程,在CreateControl时是否传入父窗口指针?
      

  3.   

    谢谢两位。
    To lop5712,我是通过appwizard生成一个.exe的app工程,对于控件的引用是从Porject->Add to Project->compnents and controls加入,然后把控件加入到资源中,我的view基类是Formview.然后在view.cpp中定义一个全局变量来表示这个控件,然后调用控件中的方法,结果出现这种错误.
      

  4.   

    楼主的CWinApp派生类的InitInstance下是否调用了AfxEnableControlContainer();?
    要作为ActiveX控件的容器,必须实现那些接口,不过MFC只有在调用了AfxEnableControlContainer();之后才等自动使用上面的接口和ActiveX控件通信。楼主请确认一下InitInstance下是否调用了AfxEnableControlContainer();。
      

  5.   

    现在初步判断是控件的问题.
    因为我这里有一个以前的控件,不是我写的,我用同样的方法创建app程序,然后调用接口方法打开对话框就没有问题(以前的控件内部也实现了对话框的打开).
    但是,我现在自己写的这个ActiveX控件,里面的对话框在应用程序中就是打不开....
    大家可以做个试验看看.很简单的.up一下,大家帮帮忙吧.
    分不够,可另开贴.分不是问题...