用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,不知道有人碰到过这种情况吗?
谢谢!
然后用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,不知道有人碰到过这种情况吗?
谢谢!
解决方案 »
- 关于CStatic中改变字体
- 为何在调试时可以通过,但是运行程序时却出错
- Visual assist X 与ADO封装类
- 安装VC6.0的一个问题,急需高手指点!
- 关于WINDOWS API的地址问题(API高手进)
- 哪里有深入浅出MFC可以下载?
- 急问:调用窗口函数Invalidate()是立马返回还是等窗口刷新完毕了之后再返回?
- CTime CTimeSpan 遇到诡异问题,时间加减法不对
- 求助用GetGlyphOutline取不出 '楷体_GB2312' 中 '螣' 这个字的轮廓信息!!
- 如何在VC中读入语音文件
- 谁能解释一下这种除错技术?看过directX的example的请进!
- 我穷,只能散这么多分,谢谢各位大哥大姐的鼎力支持和帮助!都来接吧!
---- 下面介绍在制作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);
}
任何一个ActiveX控件都需要一个容器站点(提供IOleControlSite等接口)来包容,楼主在通过CWnd::CreateControl传进去的父窗口指针将作为容器站点的提供者,m_pCtrlSite就是存放着那个容器站点的指针的。
断言失败,说明这个控件的容器站点指针没有初始化,楼主可检查一下控件的创建过程,在CreateControl时是否传入父窗口指针?
To lop5712,我是通过appwizard生成一个.exe的app工程,对于控件的引用是从Porject->Add to Project->compnents and controls加入,然后把控件加入到资源中,我的view基类是Formview.然后在view.cpp中定义一个全局变量来表示这个控件,然后调用控件中的方法,结果出现这种错误.
要作为ActiveX控件的容器,必须实现那些接口,不过MFC只有在调用了AfxEnableControlContainer();之后才等自动使用上面的接口和ActiveX控件通信。楼主请确认一下InitInstance下是否调用了AfxEnableControlContainer();。
因为我这里有一个以前的控件,不是我写的,我用同样的方法创建app程序,然后调用接口方法打开对话框就没有问题(以前的控件内部也实现了对话框的打开).
但是,我现在自己写的这个ActiveX控件,里面的对话框在应用程序中就是打不开....
大家可以做个试验看看.很简单的.up一下,大家帮帮忙吧.
分不够,可另开贴.分不是问题...