5

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

但是,如果 IDL 不包含library节,则不会.tlb生成文件,并且sbtsv.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 编译器版本 8.00.0603  
版权所有 (c) 微软公司。版权所有。  
处理 .\sbtsvClientLib.idl  
sbtsvClientLib.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.idl  
oaidl.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\um\objidl.idl  
objidl.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\um\unknwn.idl  
未知.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypes.idl  
wtypes.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypesbase.idl  
wtypesbase.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\shared\basetsd.h  
basetsd.h  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\shared\guiddef.h  
引导定义.h  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\um\SessdirPublicTypes.idl  
SessdirPublicTypes.idl  
处理 C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.acf  
oaidl.acf  
midl\oleaut32.dll:错误 MIDL2020:错误生成类型库:SetFuncAndParamNames 失败:put_State (0x8002802C)

我想我将被迫手动编写类和接口,但我想检查一下我是否做错了什么可以让它工作。

4

1 回答 1

12

COM有两种。最初的类型,可追溯到九十年代初,旨在使互操作在 C 或 C++ 中工作,并由 Microsoft 的 Office 小组发起。后一种是 COM 的一个子集,最初命名为 OLE 自动化。由 DevDiv 组的 Visual Basic 团队在寻找 VBX 的替代品时开发,VBX 是 Visual Basic 早期版本的 16 位扩展模型。后来更名为 ActiveX 作为营销术语。因不安全而声名狼藉,重命名为普通 COM。

除了使用 VB 之外,自动化已经取得了令人难以置信的成功,Windows 中的任何语言运行时都支持它。它实现了一个易于实现的 COM 的严格子集,这极大地帮助了它。对于支持类型库,一种独立于语言的方式让编译器了解声明。

这并没有取代在 Windows 中仍然大量使用的“旧”COM。许多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 包装器。

于 2013-11-01T02:04:48.530 回答