1.用MIDL.exe :使用方式为MIDL.exe IDL文件名。 此工具将生成一个Tlb文件,如果该文件直接可以用VS引用生成Interop程序集则不需要下面的步骤。
2.用TlbImp.exe :使用方式为 TlbImp.exe Tlb文件名。 此工具将生成一个.NET标准的程序集,直接应用就可以了。
3.要想得到生成的Interop程序集的源码,需要自动调整一下,还可以使用reflector,将生成一个CS文件。直接加入项目即可。
执行上述指令,可以在VS的Developer Powershell中执行。
如何使用dllgetclassobject导出接口1 找出其中支持COM的 DLL比较容易,只要挨个LoadLibary然后看有没有DllRegisterServer就可以了.
2 找某个组件中的COM的CLSID不容易,你只能通过几个办法:
(1),如果有.tlb文件,可以把tlb反编译成idl文件,然后在idl中查找CoClass.反编译代码在网很多,也可以直接用VC提供的工具好象叫TLB*.exe
(2)如果没有.tlb,用同样方法看一下类型库信息有没有被编译在dll中.
(3)如果找不到类型库信息,没办法只好去注册表中找,先注册一下这个DLL(regsvr32 this.dll,或直接调用上面得到的DllRegisterServer),然后到注册表的CLSID找哪些CLSID中包含this.dll.
3 找到CLSID后就可以创建组件了,可以直接CoCreateInstance,也可以得到DLL中的DllGetClassObject
然后创建一个IUnknown,然后查找你要的接口.
4 如果你连调用什么接口什么方法都不知道,那就不要做了.你总不能总是传NULL给方法吧.
接口肯定是知道的.那就是自己定义的阿.为了实现插件功能,所有的dll都实现了同样的接口tlb肯定是没有的,
就算有,你那个方法也是不可行的.那是我自己的插件那!我要在运行的时候,扫描plugin目录
找到所有的dll,取得dll的信息(创建了他的事例并调了某个函数),以某种形式显示在界面上。
当用户选用这种功能时,我就使用他/
我不能让用户,下载了一个插件后,就去反编译他的tlb
要在编程阶段找出所有的dll的接口之类,都是非常容易的事情。
我要的是运行期的效果。你说的意思我没大听明白,要发现一个dll是不是要这样?
1 注册他.
2 搜索和遍历老长,老长的注册表,看哪一项有这个dll,找到clid
3 根据接口id和clid得到事例.
看起来好像绕了一个大大的弯子。我相信正解一定不会是这样。
tlb文件:com类型库文件。在需要使用对应com类的模块里,“#import ...*.tlb”使用之。tlh、tli文件:他们是vc++编译器解析tlb文件生成的标准c++文件。因为odl和tlb并不是C++标准的东东,有必要把它们翻译成标准的 C++类型,使得C++开发者可以使用。相信vb和j++也会把tlb翻译成自己语言兼容的类型描述信息。
tlh相当于类型申明(头文件),
tli相当于定义实现(CPP文件)。
备注一个重要的相关问题:
在VC下#import "A.tlb" no_namespace named_guids;编译后产生A.tlh和A.tli两个文件,但把TLB文件更新后,相应的两个文件没有更新。为什么?
如果更新了tlb文件,需要在菜单里 选择全部重新编译,否则编译器仍然会认为.tlh和.tli文件是最新的。
类型库可以以下面两种方式之一的形式提供:
1.作为单独的文件:这时,结果将是一个.TLB扩展,并且它是当一个IDL文件由MIDL.EXE SDK工具编译时生成的。类型库文件以二进制格式存储。可以用工具如COM/OLE
TypeLib浏览器(OleView.exe)检查它们的内容,这些工具和Visual Studio是同时发行的。
2.作为嵌入另一个PE文件的资源(例如,DLL、EXE或者OCX):这利用了Win32上PE文件的能力来嵌入资源,而不是仅运用代码并使分布更加简单。在文件中有以二进制形式包
含类型库的段。许多COM识别工具识别这个段并且可以将它展开并使用它,正如对单独TLB文件所做的,这里包括了OleView.exe。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)