gpt4 book ai didi

c++ - 如何在 COM 服务器中使用用户定义类型 (UDT)?

转载 作者:行者123 更新时间:2023-11-30 03:12:36 26 4
gpt4 key购买 nike

我有一个 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);
};

这编译很好,但我宁愿返回一个枚举:(这段代码实际上在接口(interface)定义之上)

typedef
[
uuid("..."),
v1_enum,
helpstring("Enum")
]
enum {
value_a,
value_b,
value_c
} MyEnum;

这又一次编译得很好,但是一旦我在接口(interface)和实现中将 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")];

最佳答案

(这是改编自实际的 IDL,所以我知道它有效)

[uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX), v1_enum, helpstring("Enum")]
enum MyEnum {
value_a,
value_b,
value_c
} ;

另外,在您的库部分中,您还必须包含枚举,否则枚举将不会导出到类型库:

library MyLib
{
enum MyEnum;
...
};

关于c++ - 如何在 COM 服务器中使用用户定义类型 (UDT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com