MIDL无法创建tlb时你会怎么做?

时间:2013-10-31 21:04:52

标签: c# idl midl tlbimp

我正在尝试为sbtsv.idl创建一个C#inproc服务器(它包含在Windows 8 SDK中)。几乎every instructions I发现告诉您使用MIDL创建.tlb文件,然后tlbimport创建代理dll。

但是,如果IDL不包含library部分no .tlb file will be generatedsbtsv.idl不包含library部分。

我尝试创建自己的IDL文件,该文件声明了我想在库中创建的接口

#include "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\sbtsv.idl"

[uuid(43250D0C-BBC6-4109-BCD2-6F61F0D3B611)]
library sbtsvClientLib
{
    interface ITsSbResourceNotification;
};

但是,当我尝试通过MIDL运行时,我收到以下错误

Microsoft (R) 32b/64b MIDL Compiler Version 8.00.0603  
Copyright (c) Microsoft Corporation. All rights reserved.  
Processing .\sbtsvClientLib.idl  
sbtsvClientLib.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.idl  
oaidl.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\objidl.idl  
objidl.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\unknwn.idl  
unknwn.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypes.idl  
wtypes.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypesbase.idl  
wtypesbase.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\basetsd.h  
basetsd.h  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\guiddef.h  
guiddef.h  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\SessdirPublicTypes.idl  
SessdirPublicTypes.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.acf  
oaidl.acf  
midl\oleaut32.dll : error MIDL2020 : error generating type library : SetFuncAndParamNames failed : put_State (0x8002802C)

我在想,我将被迫手工编写类和接口,但我想检查一下我是否做了任何错误,以便能够工作。

1 个答案:

答案 0 :(得分:11)

有两种COM。最初的类型,可以追溯到九十年代早期,旨在使用C或C ++进行互操作,并由Microsoft的Office小组发起。而后者,COM的一个子集最初命名为OLE Automation。由DevDiv小组中的Visual Basic团队在寻找VBX的替代方案时开发,这是一个用于早期版本的Visual Basic的16位扩展模型。后来重命名为ActiveX作为营销术语。因不安全而臭名昭着,重新命名为普通的COM。

自动化在VB使用之外取得了令人难以置信的成功,Windows中的任何语言运行时都支持它。它实现了一个易于实现的严格的COM子集,显着地帮助了它。对于支持类型库,这是一种独立于语言的方法,使编译器能够识别声明。

这并没有取代“旧”的COM,仍然在Windows中使用得非常多。很多api都是“老式”风格。非自动化类的标准bat信号是在IDL文件中看到“cppquote”。或者从IUnknown而不是IDispatch派生的接口。或者使用原始数组而不是SAFEARRAY的方法。或者来自Windows SDK标头的结构类型,只有C或C ++编译器才能读取的类型。

你在sbtsv.idl中看到的一切。

MIDL没有任何关于自动化限制的实际知识,它只是编译IDL并且在oleauto32中以人为本调用ICreateTypeInfo接口方法。当类型库格式不支持时,可以轻松地对象。错误消息很糟糕,它并没有告诉您确切的声明是什么。对于MIDL或一般的Windows SDK工具来说并不罕见,诊断不是它的优势。 DevDiv创建了友好的工具。

在sbtsv.idl中,不需要大量猜测哪个声明有问题。关于他们所有人。你真的必须这么做,自己编写[ComImport]声明。痛苦且容易出错,请考虑使用C ++ / CLI包装器。