设为首页 加入收藏

TOP

VC中COM调用的方法(一)
2013-05-03 18:10:58 来源: 作者: 【 】 浏览:134
Tags:COM 调用 方法

  近刚开始学习COM编程(www.cppentry.com),里面诸多的知识让我有点吃不消,将学习的点滴进行记录,跟大家分享。对于com的调用一直没怎么搞明白,今天通过查资料将其进行整理。(这里为了方便,dll的开发主要参考杨老师的这篇COM 组件设计与应用(五)——用 ATL 写第一个组件)。

  COM的调用方法主要有一下几种:

  准备工作

  DLL函数调用

  COM组件功能调用

  一、准备工作

  1.创建simple.dll,该COM只有一个组件,组件的ProgID为"Simple.Fun.1",一个接口:

  [cpp]

  IFun--方法Add(),

  IFun--方法Cat()

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

  [cpp] view plaincopy

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

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

  二、DLL函数调用

  通过获取函数地址进行调用DLL。通过GetProcAddress直接获取方法,接着生成类对象及类实例(这方法可以使组件不用在注册表里注册,这是最原始的方法,但这样做没什么意义,至少失去了COM对用户的透明性),不推荐使用.

  [cpp]

  //  加载动态库

  hModule = LoadLibrary(TEXT(" simple.dll"));

  if(hModule)

  {

  //  获取函数地址

  fnAdd = (LPFunc)GetProcAddress(hModule, TEXT("Add"));

  if(fnAdd)

  {

  //  调用函数

  iRet = fnAdd( 2 ,  4 );

  printf( " Result is %d " , iRet);

  }

  //  释放动态库

  FreeLibrary(hModule);

  hModule  =  NULL;

  }

  三、COM组件功能调用

  1.使用COM的智能指针。

  [cpp]

  CoInitialize(NULL);

  CLSID clsid;

  HRESULT hr=CLSIDFromProgID(OLESTR("Simple.Fun.1"),&clsid);

  CComPtr<IFun> pIFun;//智能指针

  pIFun.CoCreateInstance(clsid);

  long ret = pIFun->Add(12,12);

  TCHAR buf[1024];

  wsprintf(buf,TEXT("the retValue is: %d\n"),ret);

  MessageBox(NULL, buf, TEXT("RESULT"),MB_OK);

  pIFun.Release();//注意下

  CoUninitialize();

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

  [cpp]

  CoInitialize(NULL);

  CLSID clsid;

  CLSIDFromProgID(OLESTR("Simple.Fun.1"),&clsid);

  {

  CComPtr<IFun> pIFun;//智能指针

  pIFun.CoCreateInstance(clsid);

  long ret = pIFun->Add(12,12);

  TCHAR buf[1024];

  wsprintf(buf,TEXT("the retValue is: %d\n"),ret);

  MessageBox(NULL, buf, TEXT("RESULT"),MB_OK);

  }

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC中IDE的一些使用小技巧 下一篇VC++实现注册表监控

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: