2010-02-28 65 views
4

有人可以解釋一下當我們在COM對象和VB之間傳遞值時如何進行內存分配/取消分配。如何在VB中使用COM對象時正確管理內存?

我關注的是:1。

IMyInterface::Method1 ([in] BSTR* pVal, [in] SAFEARRAY(BSTR)* pArray); 

做,我們需要釋放對COM對象內上述指標分配的內存?

2.

IMyInterface::Method2 ([in, out] BSTR* pVal); 

在這種情況下,請問VB照顧的COM返回值釋放內存的?一旦該事件被內部處理VB(COM對象,這些返回值分配內存)

3.

IProxy_MyInterface::Event1 ([in] BSTR* pVal); 

,再次,將取消分配的內存參數通過VB照顧?

感謝您的幫助。

謝謝

回答

1

[in]參數必須由調用者進行分配,並通過調用者釋放,除非API文檔明確表示並非如此。

[in, out]參數不太清楚,因爲這是一個BSTR *可能您傳遞的BSTR將被釋放並返回一個不同的BSTR,所以您應該釋放返回的BSTR而不是您傳遞的BSTR in。

[out] and [out, retVal],意味着存儲器所有權的轉移,函數分配存儲器,然後調用者負責釋放存儲器。

對於C/C++ COM中的BSTR,您可以使用SysAllocStringSysFreeString來分配和釋放。

+0

感謝您的澄清,如果我使用「[out]/[out,retVal] BSTR *」,那麼釋放內存是否有被調用者的責任?我認爲是這樣,因爲一旦返回值,調用者無法控制該函數。請解釋。 – Nimo 2010-02-28 07:18:59

0

VB6有三種字符串參數聲明的情況 - ByVal param As String,ByRef param As StringFunction() As String。 IDL中的第一個映射到[in] BSTR param,第二個到[in, out] BSTR *param,第三個到[out, retval] BSTR *retval

VB6無法聲明[in] BSTR *[out] BSTR * params,但它仍然可以使用這些參數,即它可以調用聲明爲out-only或任何其他IDL支持方式的方法(在VC上)。

另請注意,BSTR本身是一個typedef'd指針,類似wchar_t *,所以BSTR *實際上是wchar **。 IDL需要一個輸出參數的指針,所以你不能聲明[out] int param[out] BSTR param也很奇怪。

一旦[in] BSTR *混淆是明確的(它不需要奇怪的雙重間接所需的輸出參數,但不是僅用於輸入),簡單的規則是,一旦你在param聲明中有一個*,然後調用方必須在方法之後釋放它如果它已經不是NULL,則調用它。

[in, out] SAFEARRAY(BSTR)* pArray映射到VB6 ByRef pArray() As String,你不能改變這ByVal即*由VB6需要,因此它不能成爲只和調用者解除分配安全數組。這不是唯一的安全陣列。