CoCreateInstance用法.doc_第1页
CoCreateInstance用法.doc_第2页
CoCreateInstance用法.doc_第3页
CoCreateInstance用法.doc_第4页
CoCreateInstance用法.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CoCreateInstance 2008-09-25 13:33:44标签:COM COM客户端感兴趣的是它可以调用的函数,在COM中,你可以通过接口来访问一套有用的函数。接口最简单的形式就是函数的一个集合。当我们得到COM服务器的一个接口时,我们就得到了一个指向一套函数的指针。通过调用CoCreateInstance()函数,你就可以得到一个接口的指针。这是一个非常强大的函数,它可与COM子系统进行交互,并做以下的事情:查找服务器开始、载入或者连接到服务器在服务器端创建一个COM对象返回指向COM对象接口的一个指针对于查找和访问接口,有两种数据类型是很重要的,它们是:CLSID和IID。它们都是Globally Unique IDs (GUIDs)。GUIDs用作唯一辨认所有的COM类和接口。为了得到某个特别的类和接口,你需要它的GUID。要得到GUID,有许多方法。通常我们可以由服务器的头文件得到CLSID和IID。在我们的例子中,我们在源代码的开始部分使用#defind语句定义了GUID。通过接口的一般名字来查找GUID也很方便的。让我们得到接口指针的函数是CoCreateInstance。hr = CoCreateInstance( CLSID_BeepObj, / COM class idNULL, / outer unknownCLSCTX_INPROC_SERVER, / server INFOIID_IBeepObj, / interface id(void*)&IBeep ); / pointer to inter第一个参数是一个GUID,它可唯一指定客户端需要使用的COM类。GUID或者CLSID是COM类的标识符。世界上的每个COM类都有自己唯一的CLSID。COM将使用该ID来查找可产生请求COM对象的服务器。一旦连接到服务器,将会创建该对象。第二个参数是一个指针,它指向“outer unknown”。我们不会使用这个参数,因此传送一个NULL。在涉及到“aggregation”(集合)概念时,outer unknown是很重要的。aggregation可让一个接口直接调用另一个COM接口而无需通知客户端。aggregation和containment是接口用来调用其它接口的两个方法。第三个参数定义COM类的Context或者CLSCTX。该参数控制服务器的范围。我们可以通过它来控制服务器是进程内的服务器,还是一个EXE或者是在远程的计算机上。CLSCTX是一个位掩码,因此你可以混合几个值。这里我们使用的是CLSCTX_INPROC_SERVER-该服务器将运行在本地的计算机,并且作为一个DLL连接到客户。由于进程内的服务器是最容易实现的,因此我们在这个例子中选用它来讲解。通常客户端都不用关心服务器是如何实现的。这时它将使用CLSCTX_SERVER的值,该服务器可以是一个本地的或者是进程内的。接着是接口的标识符或者IID。这是另一个GUID-用来标识我们请求的接口。我们请求的IID必须是存在的,即被由CLSID指定的COM类支持。再次,IID的值通常由一个头文件提供,或者使用接口名查找出来。最后的参数是指向一个接口的指针。CoCreateInstance() 将创建所请求的类对象和接口,并且返回一个指向接口的指针。这个参数也是CoCreateInstance调用的目的。然后我们就可以使用该接口指针来调用服务器上方法。COM笔记-CoCreateInstance2010-06-11 23:39:00|分类: COM/ATL |标签: |字号大中小订阅 CoCreateInstance创建组件的最简单的方法是使用CoCreateInstance函数。在COM库中包含一个用于创建组件的名为CoCreateInstance的函数。此函数需要一个CLSID参数,在此基础上创建相应组件的一个实例,并返回此组件的某个接口。CoCreateInstance的声明HRESULT_stdcallCoCreateInstance(REFCLSIDrclsid,LPUNKNOWNpUnkOuter,DWORDdwClsContext,REFIIDriid,LPVOID*ppv);第一个参数:待创建组件的CLSID。第二个参数:用于聚合组件。第三个参数:dwClsContext的作用是限定所创建的组件的执行上下文。第四个参数:iid为组件上待使用的接口的iid。CoCreateInstance将在最后一个参数中返回此接口的指针。通过将一个IID传给CoCreateInstance,客户将无需在创建组件之后去调用其QueryInterface函数。CoCreateInstance的使用/ Create component.IX*pIX=NULL;HRESULThr= :CoCreateInstance(CLSID_Companent1,NULL,CLSCTX_INPROC_SERVER,IID_IX,(void*)&pIX);if(SUCCEEDED(hr)pIX-Fx();pIX-Release();CLSCTX_INPROC_SERVER值告诉CoCreateInstance只装载包含进程中服务器或DLL中的组件。类上下文CoCreateInstance的第三个参数dwClsContext可以控制所创建的组件是在与客户相同的进程中运行,还是在不同的进程中运行,或者是在另外一台机器上运行。CLSCTX_INPROC_SERVER客户希望创建在同一进程中运行的组件。为能够同客户在同一进程中运行,组件必须是在DLL中实现。CLSCTX_INPROC_HANDLER客户希望创建进程中处理器。一个进程中处理器实际上是一只实现了某个组件一部分的进程中组件。该组件的基体附录将由本地或远程服务器上的某个进程外组件实现。SLSCTX_LOCAL_SERVER客户希望创建一个在同一机器上的另外一个进程中运行的组件。本地服务器是由EXE实现的。SLSCTX_REMOTE_SERVER客户希望创建一个在远程机器上运行的组件。此标志需要分布式COM正常工作。执行上下文标记的一些预定义组合常量名称值CLSCTX_INPROCCLSCTX_INPROC_SERVERCLSCTX_INPROC_HANDLERCLSCTX_ALLCLSCTX_INPROC_SERVERCLSCTX_INPROC_HANDLERSLSCTX_LOCAL_SERVERSLSCTX_REMOTE_SERVERCLSCTX_SERVERCLSCTX_INPROC_SERVERSLSCTX_LOCAL_SERVERSLSCTX_REMOTE_SERVER另外要说明的是,CLSCTX_REMOTE_SERVER值只是在包含OBJEBASE.H之前将_WIN32_WINNT的值定义为大于或等于0x0400时才会被加到CLSCTX_ALL和CISCTX_SERVER中(在包含OBJEBASE.H之前定义_WIN32_DCOM的效果将是一样的。)若在某个不支持DCOM的系统中将CLSCTX_REMOVE_SERVER值会以给CoCreateInstance,此函数将会失败并返回一个E_INVALIDARG值。CoCreateInstance例子跟之前的区别在于客户创建组件时使用的是:CoCreateInstance,还用了CoInitialize和CoUninitialize来初始化COM库。/fangyukuan/archive/2010/04/09/1708651.html#include stdafx.h#includeusing namespace std;#include /ATLComDemo/ATLComDemo/ATLComDemo_i.c#include /ATLComDemo/ATLComDemo/ATLComDemo_i.hint _tmain(int argc, _TCHAR* argv) /声明HRESULT和Ikuan接口指针 Ikuan * IkuanATL = NULL; HRESULT hr = CoInitialize(NULL); /初始化COM /使用SUCCEEDED宏并检查我们是否能得到一个接口指针 if(SUCCEEDED(hr) hr = CoCreateInstance(CLSID_kuan, NULL, CLSCTX_INPROC_SERVER, IID_Ikuan, (void *)&IkuanATL); /如果成功,则调用AddNumbers方法,否则显示相应的出错信息 if(SUCCEEDED(hr) long ReturnValue; IkuanATL-Add(8,9,&ReturnValue); cout The answer for 8+9 is: ReturnValue Release(); else cout CoCreateInstance Failed. endl; CoUninitialize();/释放

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论