2009-04-23 54 views
1

我有一個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")]; 
+0

你可以試試`enum AA {}; HRESULT MyQuery([out,retval]枚舉AA *)`我記得midl具有非常'C'的行爲(沒有自動typedefs)。 – Ismael 2009-04-23 20:32:47

+0

您正在使用哪種編譯器? – 2009-04-23 23:19:47

+0

@John Dibling:Visual Studio 2005(出於某種原因,我還沒有完全升級到2008)。 – Mat 2009-04-24 18:43:32

回答

1

(這是改編自一個真實IDL,所以我知道它的工作原理)

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

此外,在圖書館部分,您必須包括枚舉爲好,或枚舉不會被導出到類型庫:

library MyLib 
{ 
    enum MyEnum; 
... 
}; 
1

這是非常編譯器的依賴,因爲枚舉沒有一個固定的存儲容量。

還有兼容性角度 - 你將如何表示在Visual Basic或C#中的枚舉?底層存儲就像一個整數,所以這就是COM允許的。

1

你已經差不多了,但是idl編譯器比cl.exe有更嚴格的語法。你需要像這樣在枚舉之前有最初的枚舉名。

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

如果你建立並註冊您的TLB那麼腳本語言應該能夠訪問你的枚舉腳本和.NET。

相關問題