2009-10-16 90 views
8

在我使用的一些IDL中,我注意到在方法中標記返回值有兩種約定 - [in, out][out, retval]COM IDL定義中的[in,out]和[out,retval]之間的區別

似乎當存在多個返回值[in, out]被使用,例如:

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2 
); 

看來,當僅存在一個返回值[out, retval]被使用,例如:

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1 
); 

這是一個COM IDL約定,或者僅僅是我正在使用的代碼中的約定?

從2個符號生成的代碼是否存在功能差異,還是它們是完全可互換的?

回答

23

[in, out]表示當該方法被調用時傳遞一個有效值,並且該方法返回成功時有效值(指針指向)。 [out]意味着當方法被調用時指向的值可以是任何值,但當方法返回成功時它將是有效的。參數[out][in, out]必須是指針 - 它們的值不變並且有效,並且有效性要求僅適用於它們指向的變量。

[out, retval]是一個語法糖,用於指示在創建本機COM支持包裝器時,該參數應轉換爲返回值。例如

HRESULT MyMethod([out] long* OutParam1, [out, retval] long* OutParam2); 

成爲

long IWrappedInterface::MyMethod(long* OutParam1); 

如果不將其標記[retval]包裝中將包含的方法與原簽名:

HRESULT IWrappedInterface::MyMethod(long* OutParam1, long* OutParam2); 

,只有最後一個[out]參數被標記爲[out, retval][in, out]參數不能標記爲[retval]

+0

感謝您的有用解釋。 – LeopardSkinPillBoxHat 2009-10-16 05:26:40

+0

我想補充一點,'[in,out]'可能無法被所有語言正確處理(更具體地說,老派的Visual Basic,對.NET的不確定)。 – 2009-10-16 09:58:16

+0

我想知道[out,retval]是否違背了定義COM接口的最佳實踐,因爲如果執行失敗,無法獲取錯誤代碼(HRESULT)? – dave 2014-05-28 14:47:48

0

另一個區別是它將如何在.NET代碼中的PIA中顯示。

[out,ret]將在.NET中顯示爲返回值。

[out]將在.NET中顯示有關該方法的參數。