我正在尝试为sbtsv.idl
创建一个C#inproc服务器(它包含在Windows 8 SDK中)。几乎every instructions I发现告诉您使用MIDL
创建.tlb
文件,然后tlbimport
创建代理dll。
但是,如果IDL不包含library
部分no .tlb
file will be generated,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 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)
我在想,我将被迫手工编写类和接口,但我想检查一下我是否做了任何错误,以便能够工作。
答案 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包装器。