创建COM对象(翻译)

来源:互联网 发布:汉委奴国王金印 知乎 编辑:程序博客网 时间:2024/04/27 18:15

创建COM对象

   有几种方法可以用来创建COM对象。有两种最常用的方法用来创建DirectX程序,他们是:
   1、直接方式。通过传递对象的CLSID给CoCreateInstance函数。这个函数创建对象的一个实例,并且返回你所指定的那个接口的指针。
   2、间接方式。通过呼叫DirectX的一个方法或一个函数来为你创建一个对象。这个方法创建一个对象并且返回在这个对象上的一个接口。当你通过这种方式创建一个对象的时候,通常你不能指定返回那一个接口。


   在创建任何对象之前,COM必须呼叫CoInitialize函数进行初始化。假如你用间接的方法创建一个对象,创建这个对象的方法将会自动执行这个初始化。假如你用CoCreateInstance创建这个对象
,你必须明确的呼叫CoInitialize以便进行初始化。当不再使用对象的时候,COM必须呼叫CoUninitialize进行清除初始化。假如你呼叫了CoInitialize,你就必须成对的呼CoUninitialize
.通常,应用程序需要在它的启动例程里面初始化COM对象,而在清除例程里面卸载COM对象。

  
   用CoCreateInstance新创建一个COM对象的事例,你必须有对象的CLSID。假如CLSID是公开可以使用的,你可以在参考文档或适当的头文件中找到它。假如CLSID不是公开使用的,那么你就不能用这种直接的方式创建这个对象。

   CoCreateInstance这个函数有5个参数。COM将被用于DirectX,通常,你能像下面那样设置这些参数:
  
   ●rclsid参数:这个参数设置你想创建的那个对象的CLSID.
   ●pUnkOuter参数:这个参数设置为NULL.当你聚合对象时,这个对象被使用。
   ●dwClsContext参数:这个参数设置为CLSCTX_INPROC_SERVER.这样设置这个参数表明这个对象在DLL中被实现,它将作为程序进程的一部分被运行。
   ●riid参数:这个参数设置你想要返回的接口的IID。这个函数将创建一个对象,并且在ppv这个参数中返回你所请求的接口的指针。
   ●ppv参数:在这个函数返回的时候,这个参数存放在riid中指定的那个接口的指针的地址。这个变量应该被声明为指向请求接口的指针。

   例如:下面的代码段创建了一个DirectPlay8的对象的实例,并且在g_pDP变量中返回一个指向IDirectPlay8Peer接口的指针。假如出现错误,将显示一个对话框,并且程序终止运行。

   IDirctPlay8Peer * g_pDP = NULL ;
   ...
   CoInitialize( NULL ) ;
   ...
   hr = CoCreatInstance( CLSID_DirectPlay8, NULL, CLSCTX_INPROC_SERVER,
                         IID_IDirectPlay8Peer, (LPVOID *)&g_pDP ) ;
  
   if( FAILED( hr ) )
   {
     MessageBox( NULL, TEXT( "Failed Creating IDirectPlay8Peer." ),
                  TEXT( "DirectPlay Sample" ), MB_OK | MB_ICONERROR ) ;
     return FAISE ;
   }


   用间接的方法创建一个对象非常的简单。只需将一个接口的指针传递给创建这个对象的方法即可。然后这个方法就会创建这个对象并且返回指向这个接口的指针。当你用间接的方法创建一个对象的时候,通常你不能选择返回哪一个接口,然而,你却可以指定如何创建这个对象的一些事情。例如:下面的代码段呼叫IDirect3D8::CreateDevice方法论述创建一个设备对象用来代表显示适配器。它将返回一个指向对象的IDirect3DDevice8接口的指针。这个函数的前4个参数提供了创建这个对象所需要的各种信息,第5个参数用来接受接口指针。要得到更详细的信息请参考文档。

   IDirect3DDevice8 *g_pd3dDevice = NULL ;
   ...
   if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
                                     3DDEVTYPE_HAL,
                                     hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &d3dpp,
                                     &g_pd3dDevice )))

   return E_FAIL ;

 

 

注: 由于翻译水平有限,错误在所难免。如发现翻译的不对的地方还请路上的朋友指正,谢谢

可以任意转载。

译者: closeall

 

2005.09.04 译

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买的新鞋子臭脚怎么办 鞋子臭脚怎么办如何除 惠普803墨盒干了怎么办 酷派手机无命令怎么办 华为手机锁机了怎么办 小孩被蜘蛛咬了怎么办 我是一个不爱说话的人怎么办 光动能手表停了怎么办 电波表收不到波怎么办 吃了壮阳药头疼怎么办 吃了伟哥后头痛怎么办 伟哥吃了不管用怎么办 钱站的钱还不起怎么办 面试工资要低了怎么办 线切割环保来查怎么办 喝白酒咽不下去怎么办 翠佛堂的玉假了怎么办 300英雄账号忘了怎么办 买了假酒不承认怎么办 买到假酒不承认怎么办 喝假酒胃里难受怎么办 怀孕初期塞药了怎么办 促黄体生成素高怎么办 激素脸痒的厉害怎么办 肾阴虚又肾阳虚怎么办 泡菜坛子太酸了怎么办 吃花粉过敏休刻怎么办 脸过敏怎么办才最有效 喝花粉后过敏了怎么办 阿比特龙耐药后怎么办 马蜂把人蜇了怎么办 非那雄胺副作用怎么办 来电充电宝丢了怎么办 蜂哈哈过量伤子怎么办 八个月宝宝伤食怎么办 床有虫子咬木板怎么办 床的木板有蛀虫怎么办 中蜂发生盗蜂了怎么办 中蜂发生盗蜂怎么办 孕妇给黄蜂蛰了怎么办 被葫芦蜂蜇了怎么办