【发布时间】:2010-10-21 11:03:54
【问题描述】:
我有一个 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 (User Defined Types) and 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")];
【问题讨论】:
-
你能试试
enum AA {}; HRESULT MyQuery([out,retval] enum AA*)我记得midl 有一个非常C的行为(没有自动类型定义)。 -
你使用的是哪个编译器?
-
@John Dibling:Visual Studio 2005(出于某种原因,我还没有升级到 2008)。
-
@Ismael:好吧,我得到了一个不同的错误:错误 1 错误 MIDL2011:未解析的类型声明:[过程'MyQuery'的参数'AA'(接口'IMyCOMServer')]与nichow的相同建议如下。