这是我的问题还是微软的问题?COM高手请过来

yangmajituipo 2001-09-17 03:49:51
在网上发布分布式DLL服务组件时
客户端是否还保留一个服务段的组件并注册。
有没有不需要DLL的方法,只在注册表保留接口定义
(采用类型库调度,派生于IUnknown (oleautomation)的自定义接口,是否缺了DLL就没法调度了,为什么?我的组件是在远程运行的呀???)
...全文
125 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
XT2 2001-09-18
  • 打赏
  • 举报
回复
rgs file is only a helper, what COM need is registry key here, if you cannot use rgs file, just write your own code for CLSID,APPID, Interface is ok.

register a type library will also write Inerface info in registry for oleautomation/dual interface for you.
xiaowh 2001-09-18
  • 打赏
  • 举报
回复
还是不明白,用VB的话根本就没有.reg文件,只有VBR文件,而且在VB中也无法“把.tlb文件包含在client.exe中重新编译”,不懂不懂还不懂!!!
yangmajituipo 2001-09-18
  • 打赏
  • 举报
回复
非常感谢,我已经搞定了
acptvc 2001-09-18
  • 打赏
  • 举报
回复
感谢您使用微软产品。
0x80029c4a(TYPE_E_CANTLOADLIBRARY )表示com runtime不能正确装载typelib。
如果你想全部都手工作的话,建议采用如下步骤:
1.执行.rgs文件注册server实现的interfaces.(也可通过注册Server DLL而后删除该dll达到).
2.使用oleview.exe/regedit修改注册表让server dll指向远端机器
3.注册.tlb 文件 regsvr32 c:\abc\mytlb.tlb

如果你把.tlb文件包含在client.exe中重新编译,那么在编译完后要对该exe中的.tlb进行注册,告诉com runtime在哪里找到.tlb。
比如下面的语句是从mfa.exe的资源3中装载.tlb文件。
ITypeLib *ptlib;
LoadTypeLib("C:\\MONTANA\\EXE\\MFA.EXE\\3", &ptlib)

通常建议调用RegisterTypeLib来注册包含在exe中的tlb.

微软亚洲技术中心 VC技术支持

本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款 (http://www.csdn.net/microsoft/terms.shtm)。
XT2 2001-09-18
  • 打赏
  • 举报
回复
registering typelib will give all the necessary interface information to automation marshaler, however you still need some other registry keys

1. CLSID--associate CLSID with interface and APPID
2. APPID- let COM find remote server

So you can register typelib by some existing tools (if you can find), or by following functions:
LoadTypeLib
RegisterTypeLib
Besides you need register CLSID/APPID, you can write your own code to do this or copy rgs file from server side and leverage on ATL's code to do it.
yangmajituipo 2001-09-17
  • 打赏
  • 举报
回复
非常感谢
不知道如何发布
我是这样做的,将能运行DCOM,保留了Server Dll的客户端
1。将 .tlb包含在 Client exe中重新编译
2。删去Server DLL
但返回0x80029c4a(TYPE_E_CANTLOADLIBRARY )错误

到底如何发布呢
acptvc 2001-09-17
  • 打赏
  • 举报
回复
感谢您使用微软产品。
回答这个问题前应该搞清楚你的dcom所使用的marshaler. 大多数程序员常用的marshaler有两种:/Oicf marshaler (也叫standard marshaler), automation marshaler (也叫typelib marshaler, universal marshaler). 从理论上来说,不管使用哪种marshaler,com runtime 都不需要客户端保留一个服务端的dll。以下是使用这两种marshaler时候com runtime需要的信息:
1. /Oicf marshaler
Clients: 注册通过midl.exe 和VC 编译器生成的proxy/stub dll; 注册你的com server所实现的接口(通常使用一个.rgs文件)
Server: register your com server DLL and proxy/stub dll
2. Universal marshaler
clients: register the .tlb;注册你的com server所实现的接口(通常使用一个.rgs文件)
server: register your com server DLL and .tlb

以上是标准的方法,但在具体的发布的时候,往往把.tlb文件和.rgs文件作为资源合到dll中,这样的话在客户端就需要保留一个server DLL. 因为com runtime在运行的时候需要.tlb文件来动态创建proxy/stub,而这个.tlb文件是含在dll中的。

如果你不想在客户端保留server dll, 建议把(tlb + .rgs)文件和dll分开发布.

微软亚洲技术中心 VC技术支持

本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款 (http://www.csdn.net/microsoft/terms.shtm)。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧