0xAA55 发表于 2014-11-24 22:52:22

【COM】COM类的注册机制

认识COM的人都知道,COM的DLL需要用regsvr32.exe进行注册,而regsvr32.exe所做的事其实就是加载DLL->调用DllRegisterServer->卸载DLL,仅此而已,如果你的DllRegisterServer返回一个FAILED的HRESULT,那么regsvr32就报错:无法注册DLL。所以如果大家要编写自己的COM的DLL,需要自己实现DllRegisterServer函数的功能。

COM类相比大家常见的C++类或Java类,它有个好处:跨语言。因此对于开放源代码的一些程序,大家可以看看它的类是不是便于转换为COM类,是的话,就能将其做成COM类了。
而做成COM类则需要符合COM的规则,COM的规则就是每个COM类都需要在注册表里面注册一下。这个注册的过程,就是DllRegisterServer的实现,那么大家就需要了解自己应该写入哪些内容。

每个COM类都需要一个GUID来存储它的ID。因此你需要给自己的COM类定义一个GUID。
然后在注册表HKEY_CLASSES_ROOT\CLSID项的下面建立一个新的项,内容就是你的GUID。
假设是微软的TTS发音引擎的COM类,它的ID就是96749377-3391-11D2-9EE3-00C04F797396
那么它就在HKEY_CLASSES_ROOT\CLSID\{96749377-3391-11D2-9EE3-00C04F797396}这里。
它的值为"SpVoice Class"
然后它有如下的子项:

项名值描述
InprocServer32%SystemRoot%\System32\Speech\Common\sapi.dllCOM类所在DLL的绝对路径的UNICODE字符串,可以使用环境变量
ProgIDSAPI.SpVoice.1COM类的“名字”,带版本号,它的存在的意义就是可以直接用VB的CreateObject("不带版本号的名字")来创建。
Version5.4版本号,是字符串
VersionIndependentProgIDSAPI.SpVoice不带版本号的名字


因此我们创建了COM类后,就应该像这样写入以下的值,详细的请看MSDN。

0xAA55 发表于 2014-11-24 23:03:12

IDirect3D9是个COM类,但是好像没有注册,d3d9.dll也没有提供相应的注册函数,如果我们使用如下的reg文件,也许能将其注册了,然后供VB、VBS使用。Windows Registry Editor Version 5.00


@="Direct3D 9"


@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6D,00,52,00,\
6F,00,6F,00,74,00,25,00,5C,00,53,00,79,00,73,00,\
74,00,65,00,6D,00,33,00,32,00,5C,00,64,00,33,00,\
64,00,39,00,2E,00,64,00,6C,00,6C,00
"ThreadingModel"="None"


@="DirectX.Direct3D.9"


@="9.c"


@="DirectX.Direct3D"


@="Direct3D 9"


@="{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"


@="DirectX.Direct3D.9"


@="Direct3D 9"


@="{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"

0xAA55 发表于 2014-11-25 00:17:55

貌似这个办法行不通。。

KxIX 发表于 2014-11-25 01:43:43

卡卡 发表于 2015-6-12 18:17:21

0xAA55 发表于 2015-6-12 22:01:32

omgkaka 发表于 2015-6-12 18:17
有类型库文件tlb的话 也许能成功吧
d3d9.dll本身没带类型库文件的.
噢看了d3d9.dll都没导出dllgetclass ...

那看样子有戏——直接写个d3d9vb,封装一下d3d9.dll,然后导出DllGetClassObject,目测就可以给VB用了。

卡卡 发表于 2015-6-13 11:05:47

页: [1]
查看完整版本: 【COM】COM类的注册机制