用一般MFC生成COM的EXE, 记得加上 1 TYPELIB "XXXXXXXXS.tlb"

前几天将地图COM 的exe编译个release版本给现场的人员, 现场反馈com的一些事件进不去,尴尬 问了下老大,老大说“在exe所在目录中加入了同名的.tlb文件,客户端能调用到事件啦.”
后来我找了找原因,也没有咋看明白.  我查找到 因为我的组件都不是直接用ATL生成,而是通过给一般的MFC程序添加ATL支持做的,所以在Resource里不会自动添加 1 TYPELIB "res\ExeTest.tlb"在IDE菜单里 View -> Resource Includes里加上这句就行了:

 

自己直接用ATL生成exe做了下(图1).

用一般MFC生成COM的EXE, 记得加上 1 TYPELIB "XXXXXXXXS.tlb"_第1张图片 

在看看自己那个工程

 

 

我再次在csdn 中查啦下

在网上发布分布式DLL服务组件时
客户端是否还保留一个服务段的组件并注册。
有没有不需要DLL的方法,只在注册表保留接口定义
(采用类型库调度,派生于IUnknown (oleautomation)的自定义接口,是否缺了DLL就没法调度了,为什么?我的组件是在远程运行的呀???)
--------------------------------------------------------------- 感谢您使用微软产品。
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技术支持

你可能感兴趣的:(用一般MFC生成COM的EXE, 记得加上 1 TYPELIB "XXXXXXXXS.tlb")