【发布时间】: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