使用MIDL编译时不知道SAFEARRAY类型

时间:2015-10-19 13:07:35

标签: visual-studio com idl midl

我的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" 

1 个答案:

答案 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
        );
}