我有一個COM服務器的方法目前返回一個整數:如何在COM服務器中使用用戶定義類型(UDT)?
[
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]枚舉AA *)`我記得midl具有非常'C'的行爲(沒有自動typedefs)。 – Ismael 2009-04-23 20:32:47
您正在使用哪種編譯器? – 2009-04-23 23:19:47
@John Dibling:Visual Studio 2005(出於某種原因,我還沒有完全升級到2008)。 – Mat 2009-04-24 18:43:32