Winapi 如何调用MIDL编译器从.IDL文件生成.TLB文件(类型库)?

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); }

我正在努力解决一个看似超级简单的问题:我想使用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);
}
以下是调用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,应足够。