browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

COM学习笔记(5)

Posted by on 2004 年 05 月 14 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

COM服务器

最简单的COM服务器为进程内服务器,它通常被装载到客户程序的地址空间中。如果COM库要使用进程内服务器的话,那么该服务器必须做到以下两点:
1、在注册表的HKEY_CLASSES_ROOT\CLSID中注册。
2、导出一个名为DllGetClassObject的函数。
此外,服务器还通常导出以下函数:

  • DllCanUnloadNow:由COM库调用,用以查看该COM服务器是否可以从内存中卸载。
  • DllRegisterServer:由注册程序(如RegSvr32)调用,注册服务器。
  • DllUnregisterServer:注销服务器。

CoCreateInstance内幕

一个CoCreateInstance的调用过程如下:

  1. 客户程序调用CoCreateInstance,传递相应的组件CLSID和接口IID。
  2. COM库在HKEY_CLASSES_ROOT\CLSID查找服务器的CLSID。
  3. COM库读取服务器DLL的全路径,并将该DLL装入客户程序的地址空间。
  4. COM库调用服务器的DllGetClassObject,向类厂请求相应的组件。
  5. 服务器创建一个类厂,并从DllGetClassObject返回之。
  6. COM库调用类厂的CreateInstance方法,创建客户程序请求的COM对象。
  7. CoCreateInstance向客户程序返回所请求的接口。

COM服务器的注册

当COM服务器被注册(通常通过DllRegisterServer)后,它将会在HKEY_CLASSES_ROOT\CLSID下创建一个以自己CLSID为名的子键,例如Microsoft Excel工作表:
{00020810-0000-0000-C000-000000000046}
该子键的“默认”键的键值为该组件的字符串名称。
在组件的子键下,有一个名为InprocServer32的子键。这个子键包含了两个字符串:“默认”键的键值为服务器DLL的全路径,“ThreadingModel”键的键值为线程模型——对于单线程服务器,这个值取Apartment。

订阅本站

没有评论

(Required)
(Required, will not be published)