Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 使用MIDL编译时不知道SAFEARRAY类型_Visual Studio_Com_Idl_Midl - Fatal编程技术网

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

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

我的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
        );
}
/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的东西是很久以前的事了…不管怎样,这似乎是一个次要问题,也许它需要一个新的问题,但你的回答解决了我原来的问题!