【问题标题】:How to declare a typdef in COM object idl?如何在 COM 对象 idl 中声明 typedef?
【发布时间】:2016-12-22 17:57:21
【问题描述】:

我有一个用 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(对于简单类型和序列)的正确方法是什么?

【问题讨论】:

    标签: c++ visual-studio sequence typedef idl


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您好汉斯,谢谢您的回答。但是,我不确定我们是否完全了解对方。我将解释我们试图做什么:我们想从我们的 C# 代码中调用一个 idl 函数。此函数获取一些 typedef 变量作为参数。所以我们试图在我们的 idl 中声明这些 typdef,以便能够在我们的 C|# 中创建它们并将它们作为参数发送给这个 idl 函数。
    • 您将不得不停止谈论“typedef 变量”,这是一个完全没有意义的短语,无法帮助我们帮助您。您在 C# 程序中使用 new 语句“创建”某些东西,这需要 IDL 中的 coclass。或者您要求一个 COM 对象为您创建它,这需要一个返回接口指针的工厂函数。
    【解决方案2】:

    查看 MIDL 参考文档。显然没有sequence 关键字。 This 建议:

     typedef struct {
        int     foo;
     } IntStruct;
    
     typedef struct {
        int     cMax;
        [size_is(cMax)] IntStruct values[];
     } ListOfInts;
    

     typedef struct {
        int     foo;
     } IntStruct;
    
     typedef struct {
        int     cMax;
        [size_is(cMax)] IntStruct* values;
     } ListOfInts;
    

    您真的想要名为aaanumberToAdd 的类型吗?

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多