2012-01-03 155 views
1

我正在开发Visual C++中给定组件的代理COM组件的项目。 如果“Comp”是原始组件,Proxy_Comp是代理组件,则Proxy_Comp应该能够具有与原始组件相同的接口。导入一个DLL文件到另一个IDL文件

我认为这应该通过只导入“Comp.dll”来完成。 我的一位朋友之前成功完成了这项工作。但我做不到。任何人都可以请帮忙?

回答

2

我会认为你是在谈论IDL文件中的指令importlib。它需要一个类型库,文件扩展名是.tlb。它是一个通过在.idl文件上运行midl.exe生成的二进制文件,该文件包含紧凑形式的.idl定义。

DLL不是类型库。然而,在COM自动化中,将COM服务器的类型库作为资源嵌入到DLL中是一种常见惯例。很方便将服务器代码及其接口定义保存在一起。您可以从Visual Studio轻松地看到这一点,使用File + Open + File并选择DLL。作为例子,您可以选择c:\ windows \ system32 \ shell32.dll。

资源类型名称总是“TYPELIB”,打开节点查看资源ID,总是为“1”。你可以双击它来查看内容,不是很有趣,因为它只是一个十六进制转储。你会认识到字符串,接口名称,coclasses及其成员。

关闭该窗口并右键单击“1”,请注意导出上下文菜单选项。这可让您将文件写入磁盘,并将其命名为something.tlb。现在您将拥有importlib()指令所喜欢的.tlb的精确副本。

这个.tlb可以被反编译来重新生成原始的.idl文件。启动Visual Studio提示。运行oleview.exe,文件+打开Typelib并选择.tlb。将焦点设置在右侧窗格中,键入Ctrl + A,Ctrl + C并将其粘贴到文本编辑器中。现在你得到了原始的.idl,你可以使用import指令。

如果原始.idl文件是COM自动清理并且不包含任何cpp_quote,它只具有100%的保真度。

+0

你的想法真的很棒,它工作的很好。但是我的问题不同,我没有清楚解释。有一个客户端调用原始组件中的方法。在运行时,代理应该被创建,它应该提供与原始组件相同的接口。客户不应该觉得代理与原始组件不同。 – 2012-01-04 12:16:51

+0

到目前为止,我可以检查一个原始的dll/tlb文件并在运行时生成一个代理组件。我为代理组件中的接口创建新的UUID。但是,我不应该用新的UUID创建新的接口,而应该能够将这些接口指向原始组件的接口。你能告诉我我该怎么做? – 2012-01-04 12:16:57

+0

library CalcProxyLib { \t importlib(“stdole2。tlb“); \t importlib(”C:\ Users \ Uma \ Documents \ Visual Studio 2008 \ Projects \ Tutorial \ Calc \ Windows Mobile 5.0 Pocket PC SDK(ARMV4I)\ Debug \ Calc.tlb“); \t interface IDocHostUIHandlerDispatch ; \t接口IAxWinAmbientDispatchEx; [ UUID(2c43e5f4-b9e3-421f-8131-3d61ddc84446) helpstring( “Hello类”) ] 共类Helloproxy { [默认]接口IHello; }; }; – 2012-01-04 12:18:27

2

您希望来自类型库(DLL中嵌入的.tlb数据)的接口定义。如果您安装了Windows SDK实用程序(可能带有VS),那么为您的DLL运行OLE/COM Object Viewer和“File”,“View Typelib”。这应该给你一个IDL转储,你可以复制接口定义。

(也有可能是在进口的IDL .TLB数据编译时间,如果这就是你以后一种方式,但我不知道抱歉。)

相关问题