如何调用 MIDL 编译器从 .IDL 文件生成 .TLB 文件(类型库)?
How do I invoke the MIDL compiler to generate a .TLB file (type library) from an .IDL file?
我正在努力解决看似超级简单的问题:我想使用 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 Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing .\Foo.idl
Foo.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\guiddef.h
guiddef.h
MIDL 编译器生成三个文件:Foo.h
、Foo_i.c
、Foo_p.c
…但没有 Foo.tlb
。我是不是误会了什么,或者哪里出了问题?
.idl 文件需要 library{}
块才能生成类型库。在此块中,您需要声明需要出现在库中的类型。一个普通的库在库部分只有 coclass
个定义,midl 会自动注入组件类使用的任何接口。
仅获取界面需要将其移入库块:
[
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
巫术确保 IUnknown 和 GUID 的定义也不会嵌入到类型库中。
我正在努力解决看似超级简单的问题:我想使用 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 Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing .\Foo.idl
Foo.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\guiddef.h
guiddef.h
MIDL 编译器生成三个文件:Foo.h
、Foo_i.c
、Foo_p.c
…但没有 Foo.tlb
。我是不是误会了什么,或者哪里出了问题?
.idl 文件需要 library{}
块才能生成类型库。在此块中,您需要声明需要出现在库中的类型。一个普通的库在库部分只有 coclass
个定义,midl 会自动注入组件类使用的任何接口。
仅获取界面需要将其移入库块:
[
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
巫术确保 IUnknown 和 GUID 的定义也不会嵌入到类型库中。