我的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:参数的类型不能 来自无效或无效*:[Type' PVOID' (参数'数组')] 1>。\ Something.odl(17):错误MIDL2105:指针/数组未派生 任何尺寸:[Field' rgsabound' Struct' tagSAFEARRAY' (参数 '阵列' )] 1>。\ Something.odl(17):错误MIDL2465:结构 包含符合数组必须通过引用传递。请参阅MSDN 更多细节:[Struct' tagSAFEARRAY' (参数'数组')]
如果我将类型从SAFEARRAY
更改为SAFEARRAY*
(我不相信它是正确的?)我会遇到不同的错误:
1>。\ Something.odl(17):错误MIDL2139:参数的类型不能 来自无效或无效*:[Type' PVOID' (参数'数组')] 1>。\ Something.odl(17):错误MIDL2105:指针/数组未派生 任何尺寸:[Field' rgsabound' Struct' tagSAFEARRAY' (参数 '阵列' )]
这只是一个我需要包含其他标题的情况吗?我在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"
答案 0 :(得分:2)
您需要告诉它SafeArray中的元素类型。例如SAFEARRAY(unsigned char)*无符号字符数组的数据。如果数组元素的数据类型在运行时是可变的,则可以将元素作为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
);
}