【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。 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}" 貌似这个办法行不通。。 omgkaka 发表于 2015-6-12 18:17
有类型库文件tlb的话 也许能成功吧
d3d9.dll本身没带类型库文件的.
噢看了d3d9.dll都没导出dllgetclass ...
那看样子有戏——直接写个d3d9vb,封装一下d3d9.dll,然后导出DllGetClassObject,目测就可以给VB用了。
页:
[1]