- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试为 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/
如何使用 MIDL 为 x86 和 x64 生成代码? 我在 Visual Studio 2010 中创建了一个 IDL 文件,当我在 x86 模式下编译产品时,然后在 x64 中编译产品时,我必须“
我用 linux 工具编译的 idl 文件很好,但是当我尝试使用 midl 编译时我得到一个错误 error MIDL2025 : syntax error : expecting a declara
我正在尝试继承和扩展 MIDL 中定义的结构。我使用了与接口(interface)继承相同的语法,即 typedef struct stDBIBinVarDataEx { float x;
我在自动化遗留产品的构建过程中遇到了困难... 我有一个在 VC++ 6.0 中编译的 .idl 文件,使用 midl 生成一个 .tlb、.h 和 .c 文件,其中包含要添加的手动构建步骤: str
我的项目(OCX)有问题:当我尝试在 Release模式下编译时,编译停止并显示以下消息: "1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V
MIDL 方法声明中没有常量引用吗???? 例如。 [id(1), helpstring("My Method")] HRESULT MyMethod( [in] IID & const rc
当我从另一个 Proxy Server 项目中定义的接口(interface)派生所述接口(interface)时,为什么我不能在 idl 文件中定义一个接口(interface),然后让 CoCla
我正在编写自定义 ATL ActiveX 组件,但我遇到了这个小问题:Visual Studio 坚持认为 *.idl 文件中定义的每个函数都必须具有 HRESULT 返回类型,即使我想要一个 ULO
我有一个简单的 IDL 文件,它只包含一个 enum。其中一个标识符是 cy。 [ uuid(2642345F-F2AB-3600-8926-26E823800902), version(1.
我有一个 COM dll,它由使用 COM Inter-op 的 .NET 应用程序使用。在其中一个 CoClasses 中,有一个名为 IT6TrackData 的接口(interface),它有一
我正在使用 IDL 文件开发一些 COM 接口(interface)。一些接口(interface)方法返回 HRESULT,但我检查了 MIDL language reference on MSDN
哪个MIDL数据类型等于VB6的Boolean类型? 最佳答案 根据 MSDN Boolean在 MIDL 中可用。 关于VB6 的 bool 数据类型在 MIDL 中等效,我们在Stack Over
我在vs 2008中遇到以下错误: midl : error MIDL9008 : internal compiler problem - See documentation for suggesti
如问题所述,MIDL Compiler 的默认路径是什么?在 Visual Studio 2013(或以前的版本)中,对于那些想要从命令行手动运行它来构建 IDL 文件的人来说? 最佳答案 这取决于您
ID2D1RenderTarget 是在d2d1.h 中定义的接口(interface)。我想像这样在我的 IDL 界面中使用它: interface IXXX : IUnknown { HR
我们确实有一个项目使用 MIDL 工具来创建特定的头文件/iid 和代理文件。这些文件使用调用 nmake 的构建后步骤进行编译并与项目的其余部分链接。 IDL 生成的文件可以使用预编译头文件吗?如何
我有一个简单的 .IDL 文件 (iface.idl),它描述了一个基于 IUnknown 的接口(interface): import "unknwn.idl"; [ uuid(80DFDD
我打算将 MIDL 编译器与 CMAKE 一起使用,但无法从 CmakeList 调用 MIDL 编译器 这是我用来实现目标的命令 add_custom_command( OUTPUT ${CMAKE
我有一堆对象继承了从 idl 文件生成的抽象接口(interface)。使用这些接口(interface)的每个对象都包含相同的文件 interfaces.h,其中包含映射到 idl 接口(inter
我正在尝试用 midl 编译我的 arith.idl 文件。我正在运行 Windows 7 专业版。 这是我在 powershell 提示符下启动的命令: PS> 'C:\Program Files
我是一名优秀的程序员,十分优秀!