У меня есть COM-сервер с методом, который в настоящее время возвращает целое число:
[
object,
uuid("..."),
dual,
helpstring("IMyCOMServer Interface"),
pointer_default(unique)
]
__interface IMyCOMServer : IDispatch
{
[id(1), helpstring("method MyQuery")]
HRESULT MyQuery([in] BSTR instr, [out,retval] int* outint);
};
Это прекрасно компилируется, но я бы лучше вернул перечисление: (этот код на самом деле выше определения интерфейса)
typedef
[
uuid("..."),
v1_enum,
helpstring("Enum")
]
enum {
value_a,
value_b,
value_c
} MyEnum;
, который снова сам компилируется нормально, но как только я изменяю int*
на MyEnum*
в интерфейсе и реализации, я получаю ошибки компоновщика:
[id(1), helpstring("method MyQuery")]
HRESULT MyQuery([in] BSTR instr, [out,retval] MyEnum* outint);
error MIDL2025 : syntax error : expecting a type specification near "MyEnum"
Какой бы способ я ни делал, я не могу заставить его скомпилироваться.
Благодаря Euro Micelli выясняется, что реальная проблема заключается в том, что мой пользовательский тип (перечисление) не попал в сгенерированный файл .IDL. Судя по форумным запросам в Интернете, это, кажется, общая проблема.
Статья в блоге Star Tech: UDT (определяемые пользователем типы) и COM указали мне правильный путь. Похоже, что обходной путь необходим при использовании атрибутивной ATL.
В итоге я внес следующие изменения:
Создано udt.idl
:
import "oaidl.idl";
import "ocidl.idl";
[
uuid("..."),
v1_enum,
helpstring("Enum")
]
typedef enum MyEnum {
value_a,
value_b,
value_c
} MyEnum_t;
[
version(1.0),
uuid(...),
helpstring(...)
]
library MyLibrary
{
enum MyEnum;
}
Добавлена следующая строка перед атрибутом модуля в основном файле .cpp
, чтобы вышеуказанный IDL был импортирован в сгенерированный файл:
[importidl("udt.idl")];