Winapi 如何调用MIDL编译器从.IDL文件生成.TLB文件(类型库)?
我正在努力解决一个看似超级简单的问题:我想使用MIDL编译器从Winapi 如何调用MIDL编译器从.IDL文件生成.TLB文件(类型库)?,winapi,com,idl,typelib,midl,Winapi,Com,Idl,Typelib,Midl,我正在努力解决一个看似超级简单的问题:我想使用MIDL编译器从.idl文件生成一个类型库(.tlb文件)。但是,我无法让MIDL生成.tlb文件 这是我的Foo.idl: import "unknwn.idl"; [object, uuid(400075B9-4BD6-45A5-B8B7-9DA0CF7B9B13)] interface IFoo : IUnknown { HRESULT DoFoo([in] int arg, [out, retval] int *result); }
.idl
文件生成一个类型库(.tlb
文件)。但是,我无法让MIDL生成.tlb
文件
这是我的Foo.idl
:
import "unknwn.idl";
[object, uuid(400075B9-4BD6-45A5-B8B7-9DA0CF7B9B13)]
interface IFoo : IUnknown
{
HRESULT DoFoo([in] int arg, [out, retval] int *result);
}
以下是调用MIDL编译器的方式:
midl Foo.idl/tlb Foo.tlb
将以下输出写入控制台:
Microsoft(R)32b/64b MIDL编译器版本7.00.0555
版权所有(c)微软公司。版权所有。
正在处理。\Foo.idl
Foo.idl
正在处理C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\include\unknwn.idl
unknwn.idl
正在处理C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\include\wtypes.idl
wtypes.idl
正在处理C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\include\basetsd.h
basetsd.h
正在处理C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\include\guiddef.h
吉迪夫
MIDL编译器生成三个文件:
Foo.h
,Foo_i.c
,Foo_p.c
…但没有Foo.tlb
。是我误解了什么,还是这里出了什么问题?在生成类型库之前,.idl文件需要一个库{}
块。在这个块中,您需要声明库中需要存在的类型。一个普通的库在库部分只有coclass
定义,midl会自动注入coclass使用的任何接口
仅获取接口需要将其移动到库块中:
[
uuid(34DC0E7C-37C1-41C1-B3FD-1755A0396308),
version(1.0),
]
library MyLibrary
{
importlib("stdole2.tlb");
[object, uuid(400075B9-4BD6-45A5-B8B7-9DA0CF7B9B13)]
interface IFoo : IUnknown {
HRESULT DoFoo([in] long arg, [out, retval] long *result);
};
};
为库使用您自己的uuid、版本号和名称。
importlib
voodoo确保IUnknown和GUID的定义也不会嵌入到类型库中。只有在library
块中定义或引用的内容才会放入TLB文件中。此外,要放入TLB的接口应该是dual
或oleautomation
或dispinterface
。TLB格式只能准确表示与自动化兼容的接口int
不是一种自动化类型-将其设置为long
@igortandtnik:谢谢您的建议。你们从哪里学到这么多好的知识!?您是否可以偶然推荐一个资源,让我阅读“TLB格式只能准确表示自动化兼容接口”位?仅获取接口需要将其移动到库块内部
声明,如接口IFoo块外定义的接口的代码>,应足够。