ActiveX 控件

对于ActiveX控件,可以在Visual Studio中使用ClassWizard的方法引入,在MFC项目中选择菜单“项目”——> “添加类”——>“ActiveX控件中的MFC类”,然后可以分别从注册表和文件两种方式中选择自己想要的组件。选择注册表中的方式获取的都是在本系统中注册了的组件,而文件则是从磁盘目录下获取COM组件。

如果想为现有程序添加对ActiveX控件的支持,可以在应用程序的InitInstance函数中添加:

    AfxEnableControlContainer

并在staafx.h中添加:

    #include <afxdisp.h>

代码组件

这类组件就是普通的没有界面的COM组件,需要再客户端程序的代码中进行引入。一般有如下几种方法:

1. 使用MFC OLE 的ClassWizard:

在MFC项目的应用程序类(*APP)中的InitInstance中添加

      AfxOleInit();

然后,选择菜单“项目”——> “添加类”——>“TypeLib中的MFC类”

选择自己想要的类型库,点击“完成”后会创建自己对应类型库的组件包装类,然后在代码中调用组件包装类类对象的CreateDispatch和ReleaseDispatch来创建和销毁对象。

2.使用COM库函数

在应用程序类的InitInstance函数的开始和结束处分别添加:

    BOOL CSampleApp::InitInstance(){CoInitialize(NULL);
       ...
       CoUninitialize();return FALSE;}

然后,在对话框类中包含组件的头文件:

    #include "COMSample.h"
    #include "COMSample_i.c"

在对话框类中定义:

    protected:ISample* pSample;

之后,在对话框类的OnInitDialog中创建COM对象:

    pSample = NULL;HRESULT hr = CoCreateInstance(CLSID_Sample, NULL , CLSCTX_INPROC_SERVER, IID_ISample, reinterpret_cast<void*>(&pSample));

其中,CoCreateInstance第一个和第四个参数分别是类ID和接口ID,需要从COMSample_i.c中查找,所以当接口比较多的时候是比较麻烦的。

最后,在OnClose中释放COM对象:

    if(pSample != NULL)pSample->Release();

3.使用import指令

使用import可以对类型库文件、exe、dll进行类型导入,从而读出组件的类型信息并创建接口的包装类。
         import指令:

    #import "COMSample.tlb"

或者:

    #import "COMSample.dll"

另外,可以把组件的命名空间带入,在import指令的最后添加:no_namespace

然后会自动生成跟类型库同名的两个后缀分别是“TLI”和“TLH”的文件,其中TLH文件中包含了对组件每个接口的智能指针的定义,所以可以使用下面的方式使用组件:

    ISamplePtr iSamplePtr(__uuidof(Sample));

或者:

    ISamplePtr iSamplePtr = NULL;HRESULT hr = S_OK;hr = iSamplePtr.CreateInstance(__uuidof(Sample));

其中,第二种方法可以对hr进行检测从而判断错误。

COM组件开发(四)——VC++调用COM组件的方法相关推荐

  1. HarmonyOS APP开发入门3——组件(四 CommonDialog普通弹框组件 )

    HarmonyOS APP开发入门3--组件(四 CommonDialog普通弹框组件 ) 文章目录 HarmonyOS APP开发入门3--组件(四 CommonDialog普通弹框组件 ) Com ...

  2. vue 关于父组件同时多次调用子组件而产生的 this取值 的bug问题

    vue 关于父组件同时多次调用子组件而产生的 this取值 的bug问题 我们在开发vue项目的使用,会经常使用this这个关键字,this指向vue这个实例,我们可以使用this.来获取data里面 ...

  3. vue 父循环怎么拿子循环中的值_Vue 父组件循环使用refs调用子组件方法出现undefined的问题...

    Vue 父组件循环使用refs调用子组件方法出现undefined的问题 1. 背景 最近前端项目遇到一个问题,我在父组件中使用了两个相同的子组件child,分别设置ref为add和update.其中 ...

  4. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法

    linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso {     static {         ...

  5. Win10系列:VC++调用自定义组件1

    通过20.9.1小节中的代码和步骤编写了一个名为"FilePickerComponent"的WinRT组件,接下来将在上一小节所新建的项目基础上,继续介绍如何在不同的语言所编写的应 ...

  6. php 无法创建com组件,关于IIS php调用com组件的权限问题

    关于IIS php调用com组件的权限问题 1.运行Dcomcnfg.exe 2.组件服务――计算机――我的电脑 ――DCOM配置――找到microsoft word 文档 3.点击属性 4.选择&q ...

  7. React 父组件(hooks)调用子组件(calss)方法

    父组件(hooks) let richTextRef = {};<RichText getRichText={getRichText} content={content} onRef={ref ...

  8. vue 事件调用 传参_vue如何在父组件指定点击事件后向子组件传递参数并调用子组件的事件?...

    可以给父组件写一个ref属性,父组件可以通过ref拿到子组件中的数据和方法(即例子中子组件的say方法),这样在父组件中就可以触发子组件的事件了.而父组件向子组件传参可以通过prop属性(即例子中的f ...

  9. oracle数据块调用存储过程,VC调用存储过程的通用方法(ORACLE篇)

    先对上一篇调用SQLServer的存储过程作一点补充,就是如果存储过程里有Insert,update,delete等操作,最后返回结果集,按示例代码有可能得不到数据,因为返回的数据有可能不在第一个结果 ...

最新文章

  1. 5 门可能衰落的编程语言
  2. tomcat 初始管理用户和密码
  3. idea上传项目到码云_mall前端项目的安装与部署
  4. 【高危】Strurs2又现高危漏洞(附PocExp)
  5. KAIXIN000发狠 誓将匿名制进行到底!
  6. 【JZOJ4835】【GDOI2017模拟10.31】量化交易
  7. vue路由异步组件案例
  8. VB程序VB代码:摄像头视频图像的监控,截图,录像(改进)
  9. 仿苹果手机_安卓变苹果,苹果控制中心也能用上了
  10. TouchGFX如何校准电阻触摸屏
  11. 【技巧】SourceInsight如何设置为相对路径
  12. sql :统计各个状态总数_博客状态:统计信息和更新
  13. 下列哪项不属于Html5中input,以下哪项不属于 Html5 中 input 标签新增的输入类型?...
  14. 西电复试之——CCF 201912-1 报数
  15. Linux——进程间通信
  16. 惠普计算机怎样添加程序,小编教你惠普电脑如何进入bios设置
  17. 如何利用CRM软件建立有利可图的客户关系?
  18. 特征工程 | 信息价值IV与群体稳定性PSI
  19. 微信小程序(应用号)实战课程之记账软件开发
  20. zzuli OJ 1127: 矩阵乘积

热门文章

  1. (三十)AO和GO剖析
  2. 【已解决】Windows Service服务 出现System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可访问的日志: Security。
  3. 【嵌入式学习】嵌入式开发的第一课
  4. 格局决定结局,态度决定高度
  5. python 使用poster模块进行http方式的文件传输到服务器的方法
  6. HTTP状态201(Created)
  7. 四个程序员编辑器,学习编程必备
  8. 用python从身份证中提取生日信息(切片计算)
  9. CSS中的background的详细属性
  10. 机器人搭建和少儿编程的区别