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

时间:2015-05-15 21:36:44

标签: winapi com idl typelib midl

我正在努力寻找看似非常简单的东西:我想使用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.hFoo_i.cFoo_p.c ...但没有Foo.tlb。我误解了什么,或者这里出了什么问题?

1 个答案:

答案 0 :(得分:8)

.idl文件在生成类型库之前需要 bool InRange(decimal num, decimal value, decimal range) { return ((num >= value - range) && (num < value + range)); } decimal GetClosestSum(decimal value, List<decimal> elements, decimal range) { elements.Sort(); var possibleResults = new List<decimal>(); for (int x = elements.Count - 1; x > 0; x--) { if (InRange(elements[x], value, range)) possibleResults.Add(elements[x]); decimal possibleResult = elements[x]; for (int i = x - 1; i > -1; i--) { possibleResult += elements[i]; if (possibleResult > (value + range - 1)) possibleResult -= elements[i]; if (InRange(possibleResult, value, range)) possibleResults.Add(possibleResult); } } decimal bestResult = -1; for (int x = 0; x < possibleResults.Count; x++) { if (bestResult == -1) bestResult = possibleResults[x]; if (Math.Abs(value - possibleResults[x]) < Math.Abs(value - bestResult)) bestResult = possibleResults[x]; } return bestResult; } 块。在此块中,您需要声明库中需要存在的类型。普通库在库部分只有library{}个定义,midl会自动注入coclasses使用的任何接口。

获取界面需要将其移动到库块中:

coclass

使用您自己的uuid,版本号和库的名称。 [ 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); }; }; voodoo确保IUnknown和GUID的定义也不会嵌入到类型库中。