在C#中使用IDL文件,IDL是个接口定义文件

在C#中使用IDL文件,IDL是个接口定义文件,第1张

在C#中如果我们需要调用API等COM类型的函数,有Tlb文件还好,VS可以直接引用,但是很多情况下引用是不成功的,要想得到一个C#自动封装好的COM的Interop程序集,我们可以这样做:

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。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12028945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存