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

标签 winapi com idl typelib midl

我正在为看似 super 简单的事情苦苦挣扎:我想使用 MIDL 编译器从 .tlb 生成类型库(.idl 文件)文件。但是,我就是无法让 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{} block 之前它将生成一个类型库。在此 block 中,您需要声明库中需要存在的类型。普通库只有 coclass在 library 部分的定义中,midl 会自动注入(inject) coclass 使用的任何接口(interface)。

仅获取接口(interface)需要将其移动到库 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 的定义也不会嵌入到类型库中。

关于winapi - 如何调用 MIDL 编译器从 .IDL 文件生成 .TLB 文件(类型库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30269119/

相关文章:

java - CORBA 序列 : can I define sequences of objects w/methods?

c# - 如何通过idl中的c++ com接口(interface)从C#传递bool

.net - 创建仅包含枚举的 COM 库时出现问题

winapi - 如果未设置存档属性并设置了索引属性,CComboBox::Dir 函数不会列出目录

c++ - COM 使用 CoMarshalInterThreadInterfaceInStream 来编码接口(interface)

c# - 如何将直接声音添加到 FilterGraph 2?

com - 什么是 XPCOM? XPCOM VS COM?

c - 在Windows中使用C在两个线程之间共享缓冲区的方法有哪些?

c++ - CreateFileMapping、MapViewOfFile、处理泄漏的 c++

c++ - basic_string<TCHAR> 不允许在它声明的地方之外定义