找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4570|回复: 6

【COM】COM类的注册机制

[复制链接]
发表于 2014-11-24 22:52:22 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
认识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。
回复

使用道具 举报

 楼主| 发表于 2014-11-24 23:03:12 | 显示全部楼层
IDirect3D9是个COM类,但是好像没有注册,d3d9.dll也没有提供相应的注册函数,如果我们使用如下的reg文件,也许能将其注册了,然后供VB、VBS使用。
  1. Windows Registry Editor Version 5.00

  2. [HKEY_CLASSES_ROOT\CLSID\{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}]
  3. @="Direct3D 9"

  4. [HKEY_CLASSES_ROOT\CLSID\{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}\InprocServer32]
  5. @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6D,00,52,00,\
  6.   6F,00,6F,00,74,00,25,00,5C,00,53,00,79,00,73,00,\
  7.   74,00,65,00,6D,00,33,00,32,00,5C,00,64,00,33,00,\
  8.   64,00,39,00,2E,00,64,00,6C,00,6C,00
  9. "ThreadingModel"="None"

  10. [HKEY_CLASSES_ROOT\CLSID\{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}\ProgID]
  11. @="DirectX.Direct3D.9"

  12. [HKEY_CLASSES_ROOT\CLSID\{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}\Version]
  13. @="9.c"

  14. [HKEY_CLASSES_ROOT\CLSID\{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}\VersionIndependentProgID]
  15. @="DirectX.Direct3D"

  16. [HKEY_CLASSES_ROOT\DirectX.Direct3D]
  17. @="Direct3D 9"

  18. [HKEY_CLASSES_ROOT\DirectX.Direct3D\CLSID]
  19. @="{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"

  20. [HKEY_CLASSES_ROOT\DirectX.Direct3D\CurVer]
  21. @="DirectX.Direct3D.9"

  22. [HKEY_CLASSES_ROOT\DirectX.Direct3D.9]
  23. @="Direct3D 9"

  24. [HKEY_CLASSES_ROOT\DirectX.Direct3D.9\CLSID]
  25. @="{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"
复制代码
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-11-25 00:17:55 | 显示全部楼层
貌似这个办法行不通。。
回复 赞! 靠!

使用道具 举报

KxIX 该用户已被删除
发表于 2014-11-25 01:43:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 赞! 靠!

使用道具 举报

卡卡 该用户已被删除
发表于 2015-6-12 18:17:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 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 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 14:57 , Processed in 0.033503 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表