问题标签 [midl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
352 浏览

com - 具有不可扩展属性的 COM 接口是否允许继承?

我有一个从另一个接口继承的接口,如下所示:

ICollection 实现将返回一个实现 IB 的对象。该对象将通过调度接口提供对 MethodA 和 MethodB 的访问。运行时不会添加其他成员。

在这种情况下是否允许 IA 上的不可扩展属性?

0 投票
0 回答
942 浏览

c++ - 在 Visual Studio 中导入类型库的正确方法是什么?

背景

我们的构建使用 ant 和自定义任务来构建 Visual Studio 项目/解决方案以及一些 Java 项目。结构基本上是一棵大树,项目中的工件通常向上复制到一个公共构建目录。

这以前完全是一团糟,我已经大大简化了 ant 脚本,现在我已经完成了 Visual Studio 项目/解决方案的大部分工作。这些项目非常古老,并且已通过 Visual Studio 的每个版本升级到 2013 年。我所做的部分更改是使用尽可能多的默认项目属性和宏。其中大多数曾经是硬编码的。

尽管我已修改项目以使用 $(Configuration) 宏将工件与不同的配置分开,但它们仍会被复制到其他解决方案中其他依赖项目的公共位置。因此,为了避免混淆并确保我们的调试版本链接到所有调试库(以前没有发生过),我一直在为目标名称添加后缀。例如,调试 Unicode 构建的目标名称将是 $(ProjectName)DU。

问题

到目前为止这一切都很好,但现在我不确定如何为我们的一个 COM 库完成这些更改。这个库有一个 IDL 文件,MIDL 编译器生成一个 TLB 文件。也许这不是一个好方法,但现在我希望 TLB 文件也有不同的后缀,具体取决于构建。问题是,当我更改 MIDL 配置的类型库属性时,这会破坏 RC 文件中的编译时指令。我认为可以在 TEXTINCLUDE 块中使用 #ifdefs,具体取决于是否设置了 _UNICODE 或 _DEBUG(前提是我通过 Resource Includes 对话框执行此操作,因此我不会破坏 RC 文件)。这也意味着还有其他 importlib 属性也需要 #ifdef 检查。

目前它有点工作而无需重命名 TLB 文件,但这只是因为它们目前仅在此解决方案中使用。

有没有人做过这样的事情或知道更好的解决方案?

更新

我想我在这里真正需要知道的是,在另一个 COM DLL 中使用类型的最佳方法是什么?我什至应该使用 importlib 吗?MSDN 文档说,在大多数情况下,您应该改用导入。我试过这个,但打破了一大堆东西。

0 投票
1 回答
2312 浏览

c++ - 使用 importlib 属性时出现 MIDL2015 警告

我有一个旧版 Visual Studio 解决方案,其中包含多个项目(已升级到 Visual Studio 2013)。其中一个项目会生成一个 COM DLL。然后通过 importlib 属性将来自该 DLL 的 TLB 导入到另一个项目的 IDL 文件中。当 MIDL 编译器尝试编译依赖项目的 IDL 文件时,它会生成以下警告:

警告 MIDL2015:无法在 importlib 中加载 tlb

当我使用 TLB 文件的完整路径时,它可以工作。

我尝试将路径添加到 MIDL -> Additional Include Directories 属性,但我认为这仅适用于 IDL、标头和 ACF 文件(/I 开关)。

我也尝试过 Linker -> Additional Library Directories 属性,但这也不起作用。

解析 importlib 属性时 MIDL 使用什么搜索路径?

0 投票
1 回答
848 浏览

c++ - 带有 v120_xp 工具集的 Visual Studio 2013 项目有 MIDL 2072 错误

我最近搬到了 Visual Studio 2013 并升级了我所有的 c++ 项目以使用 8.1 的 windows SDK 和 v120_xp 工具集。大多数项目正在编译并且工作正常,但是我确实有两个项目拒绝构建,并出现类似于以下错误的几个错误:

所有错误均与 d3d10sdklayers.idl 文件有关。如果我单独编译文件就可以,当项目 idl 文件作为项目的一部分编译时会发生这种情况。

任何帮助或建议表示赞赏,谢谢。

0 投票
1 回答
376 浏览

com - Microsoft IDL 中的“版本”属性

我的问题是:version在定义 COM 接口、类和枚举的 IDL 文件中,标签的正确用法是什么?

它的MSN 文档令人困惑:“备注”下的第一段似乎明确表示,如果界面中有任何更改,则必须更改 IID。

但是页面的其余部分继续描述使用version具有相同 IID 的不同 s。甚至还有一个示例 COM 接口页面显示使用versionwith interface

这是怎么回事?

附加问题:是否允许versionenum? MIDL 7.00.05555 接受 的version属性enum,但是如果将版本化枚举用作函数参数,则 MIDL 会给出错误。

0 投票
1 回答
1010 浏览

com - “枚举”可以用于 COM 中的标志吗?

在 COM 对象的 IDL 中,我执行以下操作:

并且具有可以获取标志的总和(或按位或,相同的东西)的函数,例如(在 IDL 中)

预期用途的示例是:

它似乎有效,但实际上是否允许这样做,或者 RPC 传输或任何可能会拒绝不完全在枚举定义中的枚举参数值?

0 投票
1 回答
68 浏览

windows - 连续的接口函数 ID

我在中间有一个 COM 对象接口,比如

id必须是连续的吗?或者我可以像这样定义它

编译第二个版本好像没问题,但是运行时会不会出现问题?

0 投票
1 回答
231 浏览

c++ - 多处理 Microsoft 接口定义语言 (.idl) 的构建?

我有一个带有 200 个生成 .h 和 .c 的 midl 文件的 COM 项目(带有 Incredibuild 的 Visual Studio)。此 midl 文件的处理在构建开始时仅使用一个内核进行。它非常长,几乎占用了构建时间的一半。

是否可以对构建的这一部分进行多处理?

正如我在 Incredibuild 的常见问题解答中看到的,应该可以分发 MIDL 步骤。 https://www.incredibuild.com/frequently-asked-questions-technical.html#q39

(我已经启用 /MP 并且 .c/.c++ 的编译很好地并行构建。)

0 投票
1 回答
1144 浏览

c++ - MIDL 更改接口名称

我有一个 COM dll ,它由使用 COM 互操作的 .NET 应用程序使用。在其中一个 CoClasses 中,有一个名为 IT6TrackData 的接口,它有一个名为 TrackData 的 get 属性

从 IDL 文件中:

当查看上述 IDL 文件的 TLB 文件时,它显示属性为 trackData(小写的 t) 出于某种原因,客户端应用程序将此属性称为 trackData 并且到目前为止一切正常。

作为增强的一部分,上述接口已升级为具有 put 属性

现在,当查看上述 IDL 文件的 TLB 文件时,它显示属性为 TrackData(t 为大写),这打破了旧的 .NET 客户端继续使用小写“t”引用 trackData .

我已经阅读了这篇知识库文章 http://support2.microsoft.com/kb/220137/en-gb

但是有没有出路,有没有人知道解决这个问题。

感谢您的关注。

IDL 文件

0 投票
1 回答
515 浏览

com - COM 接口 (MIDL):size_is 用于可选 [out] 参数

简而言之,在以下定义中:

它用count元素填充a和b,调用者将a和/或b设置为null是否合法?

我想让调用者只查询一组结果,所以可以用

我需要修改 MIDL 声明吗?我不确定指针/指针默认属性如何发挥作用。

注意:单独获取它们是有开销的,但是获取调用者不需要的值也是如此,因此单独的 getter 或总是必须同时获取两者是低于标准的。我知道它确实适用于 inproc / in-apartment 调用,但 MIDL 生成的代理/存根会正确处理吗?