问题标签 [idl]
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.
corba - CORBA IDL 输入、输出和输入
CORBA IDL 函数参数中的 in、out 和 inout 究竟是什么意思?
c++ - 如何在 IDL 中声明类构造函数?
IDL 中的类构造函数是如何定义的?
com - 以编程方式从 TypeLibrary 获取 IDL 代码
我正在编写代码来执行以下步骤;
注册一个 .net .dll 并使用 regasm.exe 生成一个 .tlb
- 注册一个 .net .dll 并使用 regasm.exe 生成一个 .tlb
- 从 typeLibrary 生成 IDL 代码并将其存储在文件中。
- 编辑 IDL 代码,进行少量更改。
- 使用 Midl.exe 将 IDL 重新编译为 .tlb。
我确信您已经猜到了,我坚持的步骤是 IDL 的生成。我知道这可以通过使用 Windows API 附带的 OleViewer 手动完成,但是我想删除这个手动步骤。
我似乎无法通过命令行操作 OleViewer 或找到任何其他生成 IDL 代码的方法。
有人有什么想法吗?我知道生成 IDL 的代码必须在 OleViewer 的某个地方……也许有办法访问它?
c# - 向 COM 公开类似索引器的属性
我有现有的 COM 接口。我不想创建将新接口公开为 COM(具有新 GUID)的 .net 程序集,但接口的结构需要相同。
如何创建公开此接口的 .net 类(C#)?
com - 如何将 .tlb 文件转换为头文件和实现文件?
我正在尝试转换 mscorlib.tlb。它通常在 C++ 中这样使用:
如何将其转换为头文件和实现文件?
我能够使用 Visual Studio 编译一个包含上述行的虚拟 cpp 文件,并生成一个 .tlh 文件。不应该还有实现文件吗?
eclipse - 没有编译的EclipseCORBA?
我正在使用 EclipseCORBA,但主要是为了语法高亮。我想知道是否有办法关闭 IDL 编译器。原因是它不会在我的 IDL 文件中显示有效错误。
EclipseCORBA 的替代 Eclipse 插件用于突出显示 IDL 文件的语法(最好是带有格式化程序的插件 :> )也是受欢迎的。:)
.net - 创建仅包含枚举的 COM 库的问题
我正在做一个 COM 互操作项目。用 C# 和 .NET Interop 替换一些 VB 和 C++ ATL COM 项目。当我在 .NET 中定义枚举并将它们设为 ComVisible 时,它们会暴露为 Typelib.EnumType_EnumValue 而不仅仅是 Typelib.EnumValue。typelib 导出器这样做是为了确保值名称是唯一的。但我知道我所有的枚举都是独一无二的,所以我不想要下划线。如果我不去掉下划线,还有很多客户端代码需要修改。
为了找到这个问题的解决方案,我在 IDL 文件中定义了枚举,并从中创建了一个 typelib 和 .Net 互操作。
我用 MIDL.exe 创建了一个类型库,它生成一个 tlb 文件。
我用 tlbimp.exe 创建了一个程序集。使用与其他互操作程序集相同的密钥对程序集进行签名。
tlbimp OpenStructureAdapterEnum.tlb /keyfile:KeyFile.snk
然后我用 regasm.exe 注册程序集 这个程序集看起来很好,并且包含没有下划线的枚举。但问题是无法从 OLE/COM 对象查看器或 VBA 或 VB6 中看到 COM 库。当我从另一个公开的 COM 程序集中引用枚举时,包含对枚举的引用的接口部分将作为受限方法公开。
如何创建一个只包含枚举(没有下划线)并从其他 .net Interop 程序集中引用这些的 COM 库?
c# - 在 C# COM 中处理 NULL 指针输出参数
我正在使用具有以下函数定义的 COM 插件接口:
使用 tlbimp(来自 codeplex 的 tlbimp2.exe)时,.NET 库具有以下接口函数:
问题是调用应用程序将进行函数调用:
在 C# 中我实现了这个功能:
当一切都说完了,应用程序实际上得到了一个 E_POINTER 返回,而不是 S_OK。我认为这是因为 NULL 传递了 out 参数。
有没有办法在 C# 实现中检查地址指针是否为 NULL?
注意:out 参数未初始化,因此您根本无法使用这些参数。
我尝试将接口实现为 [in, out, ref] 以强制 C# 使用( ref object a, ref object b ),但这也不起作用。
更新
Hans 是绝对正确的,如果我们将其声明为 [out,ref],我们应该使用 NULL ptr 调用该函数。
erurainon 也是正确的,我们可以使用 IntPtr 来获取 Variant*。
所以这里是如何修复它:
变成了
现在我们可以使用以下方法测试 NULL 情况:
但是,由于我们正在处理 Variant,您不能只将值复制到 IntPtr,例如:
因此,在这篇文章之后,您需要创建一个结构类:
最终函数如下所示:
希望这对将来的其他人有所帮助
.net - 简单设置中的“类型库导入器无法转换成员的签名”警告
观察这个最简单的 IDL 文件:
这是我的编译方式:
注意 TlbImp 警告。生成的互操作程序集是:
属性的存在ComConversionLoss
让我感觉很糟糕,所以我的问题是如何摆脱这个警告?
PS 我的问题可能与什么原因导致“类型库导入器无法转换成员的签名”警告完全相同?. 但是,事实并非如此,因为我在命令行上编译并且警告不会在任何地方消失。
c++ - 仅使用 IDL 文件注册 COM 对象
我有一个第三方IDL文件,它在编译时会生成一个头文件和一个 _i.c 文件。所有这三个文件都是 Visual Studio 2010 项目的一部分。(到目前为止,除了尝试的 COM 初始化内容之外,该项目是空的。)
我可以通过调用来编译项目
在运行时 CoCreateInstance() 返回“类未注册”错误。
我在 Internet 上找到的所有内容都说通过在 DLL 文件或 EXE 文件上运行 regsvr32 来注册 COM 对象。但是我只有一个 IDL 文件。我尝试注册项目生成的 EXE 文件,但我收到一条错误消息,提示“模块已加载但未找到入口点 DLLRegisterServer”。
老实说,我不确定还能尝试什么。