我正在努力寻找看似非常简单的东西:我想使用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
。我误解了什么,或者这里出了什么问题?
答案 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的定义也不会嵌入到类型库中。