Тип SAFEARRAY не известен при компиляции с использованием 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: тип параметра не может быть получен из void или void *: [Тип 'PVOID' (параметр 'Array') ] 1>.\Something.odl(17): ошибка MIDL2105: pointee / array не имеет никакого размера: [Поле 'rgsabound' из Struct 'tagSAFEARRAY' (Параметр '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: pointee / array не имеет размера: [Поле 'rgsabound' из Struct 'tagSAFEARRAY' (Параметр 'Array')]
Это просто случай, когда мне нужно включить некоторые другие заголовки? Я компилирую, используя компилятор MIDL в VS2013, по-видимому, командная строка выглядит так:
/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 ответ
Вам необходимо указать тип элементов в вашем SafeArray. Например, SAFEARRAY(unsigned char) * Данные для массива беззнаковых символов. Если тип данных элементов массива является переменным во время выполнения, вы можете передать элементы как SafeArray из VARIANT. Например:
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
);
}