Visual studio 使用MIDL编译时不知道SAFEARRAY类型
我的ODL文件如下所示:Visual studio 使用MIDL编译时不知道SAFEARRAY类型,visual-studio,com,idl,midl,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 NU
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
);
}
/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> .\Something.odl(17):错误MIDL2139:无法指定参数的类型
从void或void*派生:[键入'PVOID'(参数'Array')]
1> .\Something.odl(17):错误MIDL2105:指针对象/数组未派生
任意大小:[结构“tagSAFEARRAY”(参数)的字段“rgsabound”
“Array')]1>\Something.odl(17):错误MIDL2465:结构
包含共形数组必须通过引用传递。有关详细信息,请参见MSDN
更多详细信息:[Struct'tagSAFEARRAY'(参数'Array')]
如果我将类型从SAFEARRAY
更改为SAFEARRAY*
(我不相信这是正确的?),我会得到不同的错误:
1> .\Something.odl(17):错误MIDL2139:无法指定参数的类型
从void或void*派生:[键入'PVOID'(参数'Array')]
1> .\Something.odl(17):错误MIDL2105:指针对象/数组未派生
任意大小:[结构“tagSAFEARRAY”(参数)的字段“rgsabound”
“数组”)]
这仅仅是我需要包含一些其他标题的情况吗?我在VS2013中使用MIDL编译器进行编译,命令行大致如下所示:
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
);
}
/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(无符号字符)*数据。如果数组元素的数据类型在运行时是可变的,则可以将这些元素作为变量的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中的元素类型。例如,无符号字符数组的SAFEARRAY(无符号字符)*数据。如果数组元素的数据类型在运行时是可变的,您可以将这些元素作为变量的SafeArray传递。@JJF我刚刚发现了这一点,正要回答我自己的问题。。。如果你能将此作为一个答案(最好是修复我的方法签名),我很乐意接受。指定内容类型是我的问题,谢谢。但是,当我指定
SAFEARRAY*
时,我生成的头文件看起来像/*[in]*/SAFEARRAY**Array
,这看起来不太好!不知道为什么这是个问题。我不确定您是否可以通过值传递SAFEARRAY。当您省略“*”时,midl编译器说了什么?这意味着你必须添加一个额外的引用来获取数据。如果我在IDL中按值指定,C++头会自动用指针引用它。我假设.net封送处理只是一种数组类型,我对托管代码和非托管代码之间的封送处理没有太多经验。我做的COM的东西是很久以前的事了…不管怎样,这似乎是一个次要问题,也许它需要一个新的问题,但你的回答解决了我原来的问题!