当MIDL无法创建tlb时,您会怎么做?

Sco*_*ain 5 c# idl midl tlbimp

我正在尝试创建一个C#inproc服务器sbtsv.idl(它包含在Windows 8 SDK中).找到的几乎所有指令都会告诉您使用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;
};
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行它时,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)

我想我将被迫手工编写类和接口,但我想检查一下是否有任何错误可以让它工作.

Han*_*ant 12

有两种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包装器.

  • 不幸的是,"仅包含编写良好的非混淆教程"的复选框尚未在Google上实现.我发现了一些,我只是希望你知道的皱纹中的任何钻石:) (2认同)