佚名通过本文主要向大家介绍了visual studio2008,studio2008,virtual studio2008,e studio2008,visio studio2008等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 最高分求解Visual Studio 2008的ActiveX开发问题
描述:
我在Visual Studio 2008中,用MFC ActiveX 控件向导创建了控件后,在测试的Project中,用以下方法创建了一段测试,但结果报“灾难性故障”错误,请大家帮忙看看:
1. 添加类,选择“TYPELIC中的MFC类”,选择我创建的TEST_ACTIVE_C,选择两个接口,创建出.c和.h;
2. 在对话框按钮下,增加以下代码:
CDTEST_ACTIVE_C m_active_c;
if ( m_active_c.CreateDispatch(L"TEST_ACTIVE_C.TEST_ACTIVE_CCtrl.1") ) {
m_active_c.AboutBox();
}
3. 启动测试项目,报“灾难性故障”。跟踪了一下,在oledisp1.cpp的STDMETHODIMP COleDispatchImpl::Invoke方法中报错,出错原因是调用IsInvokeAllowed方法时返回FALSE,于是产生例外出错。查了该方法的说明,说是检查该控件是否经过了初始化,如果没有初始化则返回FALSE(返回m_bInitialized的值)。那么,这种VS2008默认生成的控件要如何初始化呢? 谁能给个简单的初始化代码范例吗? 诚恳请求哪位达人给指导一下,非常感谢!
另外,同样的方法和代码,我测试旺旺的组件就一切正常,如:
CWangWangX m_wangwang;
if ( m_wangwang.CreateDispatch(L"AliIMX.WangWangX.1") ) {
AfxMessageBox( m_wangwang.GetWangWangVersion() );
}
解决方案1:
描述:
本帖最后由 ada_chang 于 2009-11-23 10:00:07 编辑
在Visual Studio 2008中用MFC ActiveX模板创建的ActiveX控件无法使用,请大家帮忙解决。我在Visual Studio 2008中,用MFC ActiveX 控件向导创建了控件后,在测试的Project中,用以下方法创建了一段测试,但结果报“灾难性故障”错误,请大家帮忙看看:
1. 添加类,选择“TYPELIC中的MFC类”,选择我创建的TEST_ACTIVE_C,选择两个接口,创建出.c和.h;
2. 在对话框按钮下,增加以下代码:
CDTEST_ACTIVE_C m_active_c;
if ( m_active_c.CreateDispatch(L"TEST_ACTIVE_C.TEST_ACTIVE_CCtrl.1") ) {
m_active_c.AboutBox();
}
3. 启动测试项目,报“灾难性故障”。跟踪了一下,在oledisp1.cpp的STDMETHODIMP COleDispatchImpl::Invoke方法中报错,出错原因是调用IsInvokeAllowed方法时返回FALSE,于是产生例外出错。查了该方法的说明,说是检查该控件是否经过了初始化,如果没有初始化则返回FALSE(返回m_bInitialized的值)。那么,这种VS2008默认生成的控件要如何初始化呢? 谁能给个简单的初始化代码范例吗? 诚恳请求哪位达人给指导一下,非常感谢!
另外,同样的方法和代码,我测试旺旺的组件就一切正常,如:
CWangWangX m_wangwang;
if ( m_wangwang.CreateDispatch(L"AliIMX.WangWangX.1") ) {
AfxMessageBox( m_wangwang.GetWangWangVersion() );
}
解决方案1:
用CWnd::CreateControl传递容器的接口到ActiveX
一般ActiveX都设计为需要一个容器的。
仍以上面的VS200801 工程为例
新建一个基于对话框的 MFC 工程
工程 | 添加类 | MFC Class From ActiveX Control
然后选择Add Class File (找到你的OCX文件添加)
然后会在 接口里发现
_DVS200801
然后添加
点击完成
工程里会生成
class CDVS200801 : public CWnd
然后使用这个 CDVS200801
CDVS200801 obj;
RECT rect;
rect.left = 100;
rect.right = 200;
rect.top = 100;
rect.bottom = 300;
obj.Create(L"test", WS_VISIBLE | WS_CHILD, rect, this, 0x1234,NULL,
0,0);
obj.AboutBox();
obj.showme();