gpt4 book ai didi

c++ - 如何在 COM 对象 idl 中声明 typedef?

转载 作者:行者123 更新时间:2023-11-27 22:49:26 25 4
gpt4 key购买 nike

我有一个用 C++ 编写的 COM 对象,我正在尝试为一个简单类型(如 int/bool)的序列声明一个 typedef 并访问它以便在 C# 中创建其类型的变量,我在其中添加了对此 COM 对象的引用。在我在这里添加的代码中,我写了两个选项我试图声明 typdef - 但它们都不适合我 - 我无法在我的 C# 类中初始化这种类型的参数。这是我的 idl 的相关部分(库):

 [
uuid(0EA0AD9B-9314-4480-8C69-22719C2EA9CF),
version(1.0),]

library ATLProject9Lib
{
typedef [public,uuid(9d286340-62c4-11e6-8b77-86f30ca893d3)]
int aaa;

typedef [public]
double numberToAdd;


struct BarStruct;
importlib("stdole2.tlb");

[
uuid(172B34D8-5D19-4635-B4AD-9171F522CA0A)
]
dispinterface _IScheduleEvents
{
properties:
methods:
};
[
uuid(34413E93-0916-4773-99C4-79163A44E4A0)
]
coclass Schedule
{
[default] interface ISchedule;
[default, source] dispinterface _IScheduleEvents;
};
};

第二个问题:例如声明一个 int 序列的 typdef:

typedef [public,uuid(9d286340-62c4-11e6-8b77-86f30ca893d3)]
sequence<int> aaa;

typedef [public]
double numberToAdd;

此代码未编译。我收到以下错误:

1>.\ATLProject9.idl(47): error MIDL2025: syntax error : expecting a declarator or * near "<"
1>.\ATLProject9.idl(47): error MIDL2025: syntax error : expecting ; or , near "<"
1>.\ATLProject9.idl(47): error MIDL2026: cannot recover from earlier syntax errors; aborting compilation

在 COM 对象中声明 typedef(对于简单类型和序列)的正确方法是什么?

最佳答案

您尝试做的事情几乎没有意义。 typedef 声明一个type 别名,只是类型的另一个名称。它没有声明变量,在 C++ 中也没有。类型别名也不存在 Tlbimp,您需要编写 C# 代码的类型库导入器,类型标识在 CLR 中非常重要,它没有使用两个名称来引用同一类型的机制。所以类型库导入器总是将 typedef 反编译为其原始名称。

在 IDL 中不能声明变量。 COM 使用非常严格的 interface-based programming完全隐藏类型实现的范例。它适用于可以在任意语言实现之间工作的互操作代码的最终原因。一个变量有太多的包袱,不同的语言实现对变量的存储地址和对齐方式有不同的选择。

泛型或模板也是不可能的,没有人同意如何实现这样的功能。或者根本不实现。例如,.NET 泛型与 C++ 模板截然不同

这些限制是有意为之的。公开您在 C++ 代码中声明的变量的唯一方法是编写一个带有属性 getter 的接口(interface)。

关于c++ - 如何在 COM 对象 idl 中声明 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38973536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com