【问题标题】:SAFEARRAY type not known when compiling using MIDL使用 MIDL 编译时 SAFEARRAY 类型未知
【发布时间】:2016-01-17 20:24:55
【问题描述】:

我的 ODL 文件如下所示:

import "oaidl.idl";
import "ocidl.idl";

[oleautomation, uuid(/* redacted */)]
interface ISomething : IUnknown
{
    HRESULT DoSomething(
        [in]BSTR User,
        [in]VARIANT Object,
        [in]SAFEARRAY Array         // may be NULL
        );
}

我遇到了错误:

1>.\Something.odl(17): 错误 MIDL2139: 参数类型不能 从 void 或 void * 派生:[类型“PVOID”(参数“数组”)] 1>.\Something.odl(17): 错误 MIDL2105: 指针/数组不派生 任何大小:[结构'tagSAFEARRAY'的字段'rgsabound'(参数 '数组' ) ] 1>.\Something.odl(17): 错误 MIDL2465: 结构 包含一致的数组必须通过引用传递。请参阅 MSDN 更多细节:[结构'tagSAFEARRAY'(参数'数组')]

如果我将类型从 SAFEARRAY 更改为 SAFEARRAY*(我认为这不正确?)我会得到不同的错误:

1>.\Something.odl(17): 错误 MIDL2139: 参数类型不能 从 void 或 void * 派生:[类型“PVOID”(参数“数组”)] 1>.\Something.odl(17): 错误 MIDL2105: 指针/数组不派生 任何大小:[结构'tagSAFEARRAY'的字段'rgsabound'(参数 '数组' ) ]

这仅仅是我需要包含一些其他标题的情况吗?我正在使用VS2013中的MIDL编译器进行编译,显然命令行如下所示:

/iid "./source/Something_i.c" /h "Something.h" /W1 /char signed /notlb /app_config /nologo /dlldata "./source/Something_dlldata.c" /proxy "./source/Something_p.c" 

【问题讨论】:

  • 您需要告诉它 SafeArray 中的元素类型。例如 SAFEARRAY(unsigned char) *Data 用于无符号字符数组。如果数组元素的数据类型在运行时是可变的,您可以将元素作为 VARIANT 的 SafeArray 传递。
  • @JJF 我刚刚发现了这一点,正准备回答我自己的问题……如果您可以将其添加为答案(最好修复我的方法签名),我将很乐意接受。跨度>

标签: visual-studio com idl midl


【解决方案1】:

您需要告诉它 SafeArray 中的元素类型。例如 SAFEARRAY(unsigned char) *Data 用于无符号字符数组。如果数组元素的数据类型在运行时是可变的,则可以将元素作为 VARIANT 的 SafeArray 传递。例如:

import "oaidl.idl";
import "ocidl.idl";

[oleautomation, uuid(/* redacted */)]
interface ISomething : IUnknown
{
    HRESULT DoSomething(
        [in]BSTR User,
        [in]VARIANT Object,
        [in]SAFEARRAY(unsigned char) *Array         // may be NULL
        );
}

【讨论】:

  • 指定内容类型是我的问题,谢谢。但是,当我指定 SAFEARRAY * 时,我生成的头文件看起来像 /* [in] */ SAFEARRAY * *Array 这看起来不太好!
  • 不知道为什么这是个问题。我不确定您是否甚至可以按值传递 SAFEARRAY。当您省略“*”时,midl 编译器会说什么?这意味着您必须添加额外的取消引用才能获取数据。
  • 如果我在 IDL 中按值指定,C++ 标头会自动通过指针引用它。我假设 .net 编组只会有一个数组类型。
  • 我没有太多在托管和非托管代码之间编组的经验。我做的 COM 东西是很久以前的......
  • 无论如何这似乎是一个附带问题,也许它需要一个新问题,但你的回答解决了我原来的问题!
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2013-08-19
相关资源
最近更新 更多