gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:19:12 30 4
gpt4 key购买 nike

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

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

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

#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)

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

最佳答案

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

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

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

您在 sbtsv.idl 中看到的所有内容。

MIDL 没有任何关于自动化限制的实际知识,它只是编译 IDL 并顽固地调用 oleauto32 中的 ICreateTypeInfo 接口(interface)方法。当类型库格式不支持时,很容易反对。错误消息很糟糕,它没有告诉你到底是什么声明出了问题。对于 MIDL 或一般的 Windows SDK 工具来说并不少见,诊断不是它的强项。 DevDiv 创建了友好的工具。

否则无需大量猜测 sbtsv.idl 中的声明错误。关于他们所有人。您确实必须以艰难的方式来做到这一点,您自己编写 [ComImport] 声明。痛苦且容易出错,请考虑使用 C++/CLI 包装器。

关于c# - 当 MIDL 无法创建 tlb 时,您会怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716579/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com