需求:
1.创建myCom.dll,该COM只有一个组件,两个接口:
   IGetRes--方法Hello(),
   IGetResEx--方法HelloEx()

2.在工程中导入组件或类型库

 #import "组件所在目录myCom.dll" no_namespace

   #import "类型库所在目录myCom.tlb"
   using namespace MYCOM;

方法一:

   CoInitialize(NULL);
   CLSID clsid;
   CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
   CComPtr<IGetRes> pGetRes;//智能指针
   pGetRes.CoCreateInstance(clsid);
   pGetRes->Hello();
   pGetRes.Release();//小心哦!!请看最后的“注意”
   CoUninitialize();

方法二:

   CoInitialize(NULL);
   CLSID clsid;
   HRESULT hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
   IGetRes *ptr;
   hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                 __uuidof(IGetRes),(LPVOID*)&ptr);
   ptr->Hello();
   CoUninitialize();

方法三:

CoInitialize(NULL);
   HRESULT hr;
   CLSID clsid;
   hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
   IGetRes* ptr;
   IGetResEx* ptrEx;
   //使用CoCreateClassObject创建一个组件(特别是mutilThreads)的多个对象的
     时候,效率更高.
   IClassFactory* p_classfactory;
   hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,
                       NULL,IID_IClassFactory, 
                       (LPVOID*)&p_classfactory);
   p_classfactory->CreateInstance(NULL,__uuidof(IGetRes),
                                          (LPVOID*)&ptr);
   p_classfactory->CreateInstance(NULL,__uuidof(IGetResEx),
                                          (LPVOID*)&ptrEx);
   ptr->Hello();
   ptrEx->HelloEx();
   CoUninitialize();

方法四:
直接从dll中得到DllGetClassObject,接着生成类对象及类实例(这方法可以
使组件不用在注册表里注册,这是最原始的方法,但这样做没什么意义,至少失去了COM
对用户的透明性),不推荐使用.

)
   {
   IClassFactory* pcf = NULL;
   HRESULT hr=(fnHello)(CLSID_GetRes,IID_IClassFactory,(void**)&pcf);
   if (SUCCEEDED(hr) && (pcf != NULL))
   {
   IGetRes* pGetRes = NULL;
   hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pGetRes);
   if (SUCCEEDED(hr)   && (pFoo != NULL))
   {
   pGetRes->Hello();
   pGetRes->Release();
   }
   pcf->Release();
   }
   } 
   FreeLibrary(hdllInst);

方法五:
通过ClassWizard利用类型库生成包装类,不过前提是com组件的接口必须是派
生自IDispatch,具体方法:
    调出添加类向导(.NET中),选择类型库中MFC类,打开,选择"文件",选择
"myCom.dll"或"myCom.tlb",接下来会出来该myCom中的所有接口,选择你想
生成的接口包装类后,向导会自动生成相应的.h文件.这样你就可以在你的MFC中
像使用普通类那样使用组件了.(CreateDispatch("myCom.GetRes") 中的参数就是ProgID通过Clsid在注册表中可以查询的到)

)
   {
   getRest.Hello();
   getRest.ReleaseDispatch();
   }
   CoUninitialize();

注意:
COM中的智能指针实际上是重载了->的类,目的是为了简化引用记数,几不需要程序
员显示的调用AddRef()和Release(),但是为什么我们在Method 1中
pGetRes.Release(),问题在与,我们的智能指针pGetRes生命周期的结束是在
CoUninitialize()之后,CoInitialize所开的套间在CoUninitialize()后已经被
关闭,而pGetRes此时发生析构,导致了程序的崩溃,解决这个问题的另一个方法是

CoInitialize(NULL);
   CLSID clsid;
   CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
   {
   CComPtr<IGetRes> pGetRes;//智能指针
   pGetRes.CoCreateInstance(clsid);
   pGetRes->Hello();
   }
   CoUninitialize();

以上就是COM的5中方法,当然具体怎么使用还是在于程序的环境,加以琢磨....

vc 中调用COM组件的方法的更多相关文章

  1. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  2. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  3. vue组件之间的通信以及如何在父组件中调用子组件的方法和属性

    在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> < ...

  4. vue父组件中调用子组件的方法

    Vue项目中如何在父组件中直接调用子组件的方法: 方案一:通过ref直接调用子组件的方法: //父组件中 <template> <div> <Button @click= ...

  5. vc中调用Com组件的所有方法详解

    首先,对于Com组件的入门学习,可以看一下<Windows程序设计技术基础——MFC与.NET> 任哲编著的21世纪重点大学规划教材那本书,适合入门(虽然不一定会使用),了解些基础原理. ...

  6. vue中父组件调用子组件的方法

    原文地址 文章目录 什么是组件? 使用组件 组件 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自 ...

  7. 在javascript中使用com组件的方法

    转载自:  http://dhailin.blog.163.com/blog/static/230738322011128102043880/ 首先创建一个COM组件,插入一个双接口Itest,在此接 ...

  8. 在JS中使用COM组件的方法

    首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 ...

  9. vue 父组件中调用子组件函数

    2019/06/06 在父组件中调用子组件的方法:  1.给子组件定义一个ref属性.eg:ref="childItem"  2.在子组件的methods中声明一个函数.eg: u ...

随机推荐

  1. 导航代码position:relative

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  2. chrome 49 版本 跨越 --args --disable-web-security --user-data-dir

    转载: 做前端的,用Ajax获取数据,是常有的事情,同域下自然没问题了,如果是不同域获取数据,浏览器就有个同源策略的限制. 如图: Origin * is not allowed by Access- ...

  3. SQL总结(六)触发器

    SQL总结(六)触发器 概念 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行. 触发器可以查询其他表,而且可以包含复杂的 S ...

  4. Lucene/Solr搜索引擎开发笔记 - 第2章 Solr安装与部署(Tomcat篇)

    一.安装环境 图1-1 Tomcat和Solr的版本 我本机目前使用的Java版本为JDK 1.8,因为Solr 4.9要求Java版本为1.7+,请注意. 二.Solr部署到Tomcat流程 图1- ...

  5. Openstack Neutron DVR workflow

    目前在Juno版本的trunk中已经合入了DVR相关的代码,我的理解是在Juno版本中DVR是一个experimental feature.最好需要稳定一个版本以后再上生产环境.之前写过一篇博文是DV ...

  6. Apache Shiro 使用手册(二)Shiro 认证

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的"实体/凭证"组合便是&quo ...

  7. MySQL日志恢复误删记录

    1.查询日志是否开启 show variables like"log_"; 2.查询是用的哪个日志文件 show master status; 3.定位是在什么时间误删的 /usr ...

  8. IOCP之客户端及消息传递

    上篇说到IOCP的精简实现,这篇来讲IOCP客户端和消息传递 在ConnectEx代码之前,CreateIoCompletionPort的第三个参数,把socket句柄+0x01000000作为传递 ...

  9. 万恶的ViewBag

    作个记录,鼓捣了一晚上,他竟然把订单事情给我篡改了 ViewBag.orderNo="20150613202108844"; 页面上出来的竟然是20150613202108840 ...

  10. UVA 753 UNIX 插头(EK网络流+Floyd传递闭包)

    UNIX 插头 紫书P374 [题目链接]UNIX 插头 [题目类型]EK网络流+Floyd传递闭包 &题解: 看了书之后有那么一点懂了,但当看了刘汝佳代码后就完全明白了,感觉他代码写的好牛逼 ...