如何调用MIDL编译器从.IDL文件生成.TLB文件(类型库)? [英] How do I invoke the MIDL compiler to generate a .TLB file (type library) from an .IDL file?

查看:2268
本文介绍了如何调用MIDL编译器从.IDL文件生成.TLB文件(类型库)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到似乎超级简单的问题:我想使用MIDL编译器从<$ c生成类型库( .tlb 文件) $ c> .idl 文件。但是,我不能让MIDL生成 .tlb 文件。

I am struggling with something seemingly super-simple: I'd like to use the MIDL compiler to generate a type library (.tlb file) from a .idl file. However, I just can't get MIDL to generate a .tlb file.

这是我的 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编译器:

This is how I invoke the MIDL compiler:

midl Foo.idl /tlb Foo.tlb

这将以下输出写入控制台:

Which writes the following output to the console:

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

The MIDL compiler produces three files: Foo.h, Foo_i.c, Foo_p.c… but no Foo.tlb. Am I misunderstanding something, or what has gone wrong here?

推荐答案

.idl文件需要一个库{} 阻塞之前,它将生成一个类型库。在这个块中,你需要声明需要在库中存在的类型。正常库在库部分只有 coclass 定义,midl会自动注入coclass使用的任何接口。

The .idl file requires a library{} block before it will generate a type library. Inside this block you'll need to declare the types that need to be present inside the library. A normal library only has coclass definitions in the library section, midl automatically injects any interfaces that the coclasses use.

获取界面需要在库块内移动:

Getting just the interface requires moving it inside the library block:

[
  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的定义不会嵌入类型库。

Use your own uuid, version number and name for the library. The importlib voodoo ensures that the definitions for IUnknown and GUID don't get embedded in the type library as well.

这篇关于如何调用MIDL编译器从.IDL文件生成.TLB文件(类型库)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆