问题标签 [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.

0 投票
5 回答
481 浏览

c++ - 在不重新编译的情况下更改 CORBA 接口

我想向现有服务器的 CORBA 接口添加一个方法。这需要重新编译所有客户端吗?

我正在使用TAO。

0 投票
3 回答
544 浏览

vb6 - 为 MAPI-MIME 转换创建 IDL

我正在尝试为 IConverterSession 接口创建 IDL,但我对MIMETOMAPI方法的定义感到困惑。它将LPMESSAGE pmsg参数指定为 [out] 但注释声明它指向要加载的 MAPI 消息的指针。

我不清楚这些函数是否分配了 MAPI 消息对象并设置了指针,在这种情况下它不应该是指向 MESSAGE 指针的指针吗?或者调用代码是否应该已经实例化了消息对象,在这种情况下为什么标记为 [out] 而不是 [in]?

Utlitmately 这个接口将从 VB6 代码中使用,因此它必须是 [in] 或 [in, out] 但我确实需要知道是否在我使用的 IDL 中:-

或者

0 投票
1 回答
4602 浏览

com - IDL 枚举未显示在类型库中

我有一个使用 MS ATL 库编写的 COM 对象。我在 IDL 中声明了一堆枚举,但在使用 MS COM 对象查看器工具查看类型库时它们不会出现。问题似乎是缺少的枚举实际上并没有被任何 COM 方法用作参数 - 我怎样才能强制这些枚举出现?

例如,在 IDL 中:

即使有问题的枚举没有被任何方法直接使用,它们仍然对使用该对象的任何人有用,但我无法让它们导出。

有没有人见过这个?

0 投票
1 回答
1770 浏览

c++ - __REQUIRED_RCNDR_H_VERSION__

我从 IDL 创建一个头文件。IDL 文件已在 Visual C++ 2005 中编译。生成的头文件包含 #define REQUIRED_RPCNDR_H_VERSION 475 。

我试图在 Visual Studio 2003 中使用这个头文件,其中 rpcndr.h 包含

{

#define RPCNDR_H_VERSION ( 450 ) // 和

#if ( RPCNDR_H_VERSION < REQUIRED_RPCNDR_H_VERSION )

}

由于 450<475 ,我得到一个编译时错误。有什么办法可以在 Visual Studio 2003 中使用头文件。我需要更改 idl 文件的编译设置吗?

PS:我只需要在 Visual C++ 2005 中编译 idl 文件。(我没有选择在 VS 2003 中编译它)。

0 投票
3 回答
2857 浏览

c# - 用于从 C# 获取 C 样式数组的函数的 IDL 声明(在 C++ 中)

我正在使用由一些用 C++ 编写的带有 C# 前端的 COM 接口组成的现有代码库。有一些新功能需要添加,所以我不得不修改 COM 部分。在一种特殊情况下,我需要将一个数组(从 C# 分配)传递给要填充的组件。

我想做的是能够将一个 int 数组从 C# 传递给该方法,例如:

几个扳手在工作:

  • 不能使用 C++/CLI 或托管 C++(在这种情况下可以取消 COM)。
  • C# 端不能用 /unsafe 编译(允许使用 Marshal)。

COM 接口仅由 C# 部分使用(将永远使用),因此我不太关心与其他 COM 使用者的互操作性。32 位和 64 位之间的可移植性也不是问题(一切都在 32 位机器上编译和运行,因此代码生成器正在将指针转换为整数)。最终,它将被 C++/CLI 取代,但这还有很长的路要走。


我最初的尝试

类似于:

并且输出 TLB 定义是(似乎合理):

这是由 C# 导入的(不太合理):

可以用它

...除了我不能用 /unsafe 编译。


在这一刻

我在用:

其中导入为:

我需要像这样使用它:

哪个有效...,但我想找到一种更清洁的方法。


所以,问题是

对于这种情况,是否存在对从 TLB 生成器导入 C# 友好的 IDL 定义?如果没有,在 C# 端可以做些什么来让它更安全一点?

0 投票
2 回答
5089 浏览

c# - 在 C# 中为客户端和服务器使用 C++ COM 接口

我需要让一段 C# 代码通过 COM 与各种实现进行交互。

为了使该集成的用户更容易,我在 IDL 中包含了交互接口(作为相关现有 DLL 的一部分,但没有 coclass 或实现),然后通过运行 Tlbimp 将其放入我的 C# 代码中以创建类型定义。

我实现了我的 C#,基于 Windows 注册表信息创建 COM 对象并将对象转换为我需要的接口。

然后我在一个单独的项目中创建了接口的 C# 实现并注册了它。主程序正确创建了测试 COM 对象,但未能将其转换为接口(使用 C#'as' 时获取空对象,获取显式转换的 InvalidCastException)。

有人可以建议为什么接口没有被测试对象识别为实现吗?

这是 IDL 中的接口定义(在 VS 2005 中用 C++ 编译):

这是 Tlbimp 为 C# 创建的存根:

这是主要 C# 代码的一部分,通过其 ProgID 创建一个 COM 对象并将其转换为 IScriptGenerator 接口:

这是实现 C# 代码,以测试它是否正常工作(但它不是):

0 投票
1 回答
1356 浏览

idl - 如果 typedef 使用未知类型,Microsoft MIDL 不会报告错误,这是一个错误吗?

我想知道我是否遗漏了什么:

当我使用以下命令编译 test.idl 时:

我得到这个输出

我得到一个错误的 test.h (在这条消息的底部),它只有

其中未知的 foo 类型被静默丢弃。

我本来预计会出现一条错误消息,说明“foo 是未知类型”,我错了吗?

我是否需要将任何特定参数传递给 MIDL 命令?

我使用 MIDL 编译器版本 7.00.0500 得到了相同的结果

0 投票
1 回答
481 浏览

com - 使用 IDL 定义纯基类

当我在 IDL 中定义一个不从任何东西派生的接口时,MIDL 预编译器会发出警告(Visual C++ 2008):
警告 MIDL2271:[object] 接口必须派生自另一个 [object] 接口,例如 IUnknown (...)

如果我从另一个不是从 IUnknown 派生的接口派生我的接口,MIDL 将失败:
错误 MIDL2257:只有 IUnknown 可以用作根接口(...)

现在,我的问题是:这是 COM 或 MIDL 预编译器的限制吗?

我最近一直在看D3D10的头文件,d3d10.h显然是使用IDL生成的(MIDL为此添加了注释)。并且所有接口都以一种或另一种方式派生自 IUnknown。

但是,外围头文件(d3d10shader.h、d3d10effect.h 等)包含手动定义的 COM 接口,其中一些会触发此处描述的警告或错误。我只能假设他们必须手动定义它们以避免这些限制。

我对吗?为什么 MIDL 会阻止纯接口?

0 投票
2 回答
4624 浏览

c++ - 预定义的 IDL 文件中没有类型定义

首先,

使用C++,没有 ATL,MFC 试图使用 COM 对象接口。

使用oleview (OLE/COM Object viewer) - 用于设计 IDL 代码。

在这个阶段,使用MIDL编译器,现在我在尝试生成以下内容时遇到了麻烦:

cmd行上的语法:

midl /nologo /env win32 /tlb ".\S8_.tlb" /h ".\S8_.h" /iid ".\S8_i.c" S8.idl

  • 对应的 .TLB(类型库)
  • A .H(标题)
  • IID 定义包含文件 (*_i.c)
  • 代理 (*_p.c)

MIDL 编译器错误:

S8.IDL(513):错误 MIDL2025:语法错误:期望“S8SimObject”附近的类型规范

0 投票
1 回答
343 浏览

c++ - 编辑由 OLE 视图为 C++ 组件创建的 IDL

执行此操作时我需要考虑哪些事项:

  • 删除/操作/添加什么

问候