byte_count屬性
[byte_count] ACF 屬性是參數屬性,可將大小以位元組為單位,與指標所指示的記憶體區域產生關聯。
[ function-attribute-list ] function-name(
[byte_count(length-variable-name)] parameter-name);
...);
-
function-attribute-list
-
指定零個或多個 ACF 函式屬性。
-
function-name
-
指定 IDL 檔案中定義的函式名稱。 需要函式名稱。
-
length-variable-name
-
指定 [in]-only 參數的名稱,指定 參數名稱所參考記憶體區域的大小,以位元組為單位。
-
parameter-name
-
指定 IDL 檔案中定義的 [out]-only 指標參數名稱。
ACF 屬性 [byte_count] 代表 DCE IDL 的 Microsoft 延伸模組。 因此,當您使用 MIDL 編譯器參數 /osf時,無法使用這個屬性。
注意
NDR64 語法不再支援 [位元組計數] 屬性,因為估計所有 [out] 參數所需的大小時發生困難。
指標參數所參考的記憶體是連續的,用戶端存根不會配置或釋放。 [byte_count]屬性的這項功能可讓您在用戶端記憶體中建立持續性緩衝區區域,以便在對遠端程式的多個呼叫期間重複使用。
關閉用戶端存根記憶體配置的能力可讓您調整應用程式的效率。 例如,使用 Microsoft RPC 的服務提供者函式可以使用 [byte_count] 屬性。 當使用者應用程式呼叫服務提供者 API 並將指標傳送至緩衝區時,服務提供者可以將緩衝區指標傳遞至遠端函式。 服務提供者可以在多個遠端呼叫期間重複使用緩衝區,而不需要強制使用者重新配置記憶體區域。
記憶體區域可以包含包含多個指標的複雜資料結構。 由於記憶體區域是連續的,因此應用程式不需要進行數次呼叫,即可個別釋放每個指標和結構。 相反地,它可以使用對記憶體配置或可用常式的一個呼叫來配置或釋放記憶體區域。
緩衝區必須是 [out]-only 參數,而以位元組為單位的緩衝區長度必須是 [in]-only 參數。
指定足以包含所有 [out] 參數的緩衝區。 由於隱藏填補,請使用超額映射,而不是確切計數。 例如,4 位元組指標在 32 位平臺上的 4 位元組對齊界限上未隔離,而 8 位元組指標則位於 64 位平臺上的 8 位元組界限上。 因此,存根將執行的對齊填補必須在緩衝區的空間中考慮。 此外,C 語言編譯期間所使用的封裝層級可能會有所不同。 使用位元組計數值,這個值會考慮針對 C 語言編譯期間所使用的封裝層級新增的額外封裝位元組。 涵蓋 32 位平臺和 64 位平臺的安全做法是假設每個進入大型記憶體區塊的物件都是從 8 倍的位址開始。
/* IDL file */
HRESULT proc1([in] unsigned long length,
[out] struct my_struct * pMyStruct);
/* ACF file */
proc1([byte_count(length)] pMyStruct);