问题标签 [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.
com - 具有不可扩展属性的 COM 接口是否允许继承?
我有一个从另一个接口继承的接口,如下所示:
ICollection 实现将返回一个实现 IB 的对象。该对象将通过调度接口提供对 MethodA 和 MethodB 的访问。运行时不会添加其他成员。
在这种情况下是否允许 IA 上的不可扩展属性?
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 文档说,在大多数情况下,您应该改用导入。我试过这个,但打破了一大堆东西。
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 使用什么搜索路径?
c++ - 带有 v120_xp 工具集的 Visual Studio 2013 项目有 MIDL 2072 错误
我最近搬到了 Visual Studio 2013 并升级了我所有的 c++ 项目以使用 8.1 的 windows SDK 和 v120_xp 工具集。大多数项目正在编译并且工作正常,但是我确实有两个项目拒绝构建,并出现类似于以下错误的几个错误:
所有错误均与 d3d10sdklayers.idl 文件有关。如果我单独编译文件就可以,当项目 idl 文件作为项目的一部分编译时会发生这种情况。
任何帮助或建议表示赞赏,谢谢。
com - “枚举”可以用于 COM 中的标志吗?
在 COM 对象的 IDL 中,我执行以下操作:
并且具有可以获取标志的总和(或按位或,相同的东西)的函数,例如(在 IDL 中)
预期用途的示例是:
它似乎有效,但实际上是否允许这样做,或者 RPC 传输或任何可能会拒绝不完全在枚举定义中的枚举参数值?
windows - 连续的接口函数 ID
我在中间有一个 COM 对象接口,比如
id必须是连续的吗?或者我可以像这样定义它
编译第二个版本好像没问题,但是运行时会不会出现问题?
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++ 的编译很好地并行构建。)
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 文件
com - COM 接口 (MIDL):size_is 用于可选 [out] 参数
简而言之,在以下定义中:
它用count元素填充a和b,调用者将a和/或b设置为null是否合法?
我想让调用者只查询一组结果,所以可以用
我需要修改 MIDL 声明吗?我不确定指针/指针默认属性如何发挥作用。
注意:单独获取它们是有开销的,但是获取调用者不需要的值也是如此,因此单独的 getter 或总是必须同时获取两者是低于标准的。我知道它确实适用于 inproc / in-apartment 调用,但 MIDL 生成的代理/存根会正确处理吗?