VC开发支持ActiveX控件工程

近日使用VC开发一个带对话框的ActiveX控件第一步:创建ActiveX控件,正常使用
第二步:ActiveX控件添加对话框,正常,参见 http://blog.csdn.net/ljz9425/article/details/719278 6
第三步:对话框添加常用控件,测试正常
第四步:对话框添加ActiveX控件,测试错误:debug assertion failed f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp,经分析得原因是因为VC在创建ActiveX是不支持嵌入其它OLE对象,修改工程初始化方法

  1. BOOL CrApp::InitInstance()  
  2. {  
  3.     BOOL bInit = COleControlModule::InitInstance();  
  4.   
  5.     CoInitialize(NULL);//添加支持OLE  
  6.     AfxEnableControlContainer();//添加支持OLE  
  7.   
  8.     if (bInit)  
  9.     {  
  10.         // TODO: 在此添加您自己的模块初始化代码。  
  11.     }  
  12.   
  13.     return bInit;  
  14. }  

原因是VC在创建应用程序向导时会提示是否支持(包含)ActiveX控件,而在创建ActiveX时向导中没有此项选择

附:

[plain]  view plain copy print ?
  1. CoInitialize  
  2.   
  3.   CoInitialize是 Windows提供的API函数,用来告诉 Windows以单线程的方式创建com对象。应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。  
  4.   语法:HRESULT CoInitialize(_in_opt LPVOID pvReserved);  
  5.   参数被保留,且必须为NULL。  
  6.   返回值S_OK : 该线程中COM库初始化成功S_FALSE 该线程中COM库已经被初始化 CoInitialize () 标明以单线程方式创建。  
  7.   使用 CoInitialize 创建可以使对象直接与线程连接,得到最高的性能。  
  8.   CoInitialize并不装载COM 库,它只用来初始化当前线程使用什么样的套间。使用这个函数后,线程就和一个套间建立了对应关系。线程的套间模式决定了该线程如何调用COM对象,是否需要列集等。  
  9.   CoInitialize ()并不会干扰客户和服务器之间的通信,它所做的事情是让线程注册一个套间,而线程运行过程中必然在此套间。  
  10.   CoInitialize和CoUninitialize必须成对使用。  
  11.   创建新的就手程序用该调用CoInitializeEx代替CoInitialize。  
[plain]  view plain copy print ?
  1. fxEnableControlContainer()函数是:允许应用程序作为控件容器来使用,也就是说你可以在这个应用程序中使用ocx之类的控件。对于用MFC向导自动生成的单文档框架程序的C...APP::InitInstance()函数中自动加了这一句 AfxEnableControlContainer();  
转自: http://blog.csdn.net/ljz9425/article/details/7193654
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值