在VB中使用COM对象时如何正确管理内存?

时间:2010-02-28 06:51:37

标签: memory-management com vb6

有人可以解释当我们在COM对象和VB之间传递值时内存分配/解除分配的方式。

我担心的是: 1。

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

我们是否需要为COM对象中的上述参数释放已分配的内存?

2

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

在这种情况下,VB是否会为COM返回值释放内存? (COM对象为这些返回值分配内存)

3

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

一旦在VB内部处理事件,再次,VB的参数存储器的取消分配是否会被处理?

感谢您的帮助。

谢谢

3 个答案:

答案 0 :(得分:2)

阅读官方文档(Allocating and Releasing Memory for a BSTR):

http://msdn.microsoft.com/en-us/library/xda6xzx7.aspx

以下是您所有案例的说明。

答案 1 :(得分:1)

[in]参数必须由调用者分配并由调用者释放,除非API文档另有说明。

[in, out]参数不太清楚,因为这是一个BSTR *,你传入的BSTR可能会被释放并返回一个不同的BSTR,所以你应该释放返回的BSTR而不是你传了一个。

[out][out, retVal]意味着转移内存的所有权,该函数分配内存,然后调用者负责释放内存。

对于C / C ++ COM中的BSTR,您可以使用SysAllocStringSysFreeString来分配和释放。

答案 2 :(得分:0)

VB6有三种字符串参数声明 - ByVal param As StringByRef param As StringFunction() As String。 IDL中的第一个映射到[in] BSTR param,第二个映射到[in, out] BSTR *param,第三个映射到[out, retval] BSTR *retval

VB6无法声明[in] BSTR *,也无法[out] BSTR *参数,但它仍然可以使用它们,即它可以调用具有被声明为out-only或任何params的方法(在VC上)其他IDL支持的方式。

另请注意,BSTR本身是一个typedef指针,类似于wchar_t *,因此BSTR *实际上是wchar **。 IDL需要一个用于指出params的指针,因此你无法声明[out] int param而且[out] BSTR param也很奇怪。

一旦[in] BSTR *混淆得清楚(对于out params而言,这是不必要的奇怪的双重间接,而不是仅用于输入),简单的规则是,一旦你在param声明中有*,那么调用者必须释放它在方法调用之后,如果它已经不是NULL。

[in, out] SAFEARRAY(BSTR)* pArray映射到VB6中的ByRef pArray() As String,你无法将其更改为ByVal,即VB6需要*,因此它不能只是in-only且调用者有解除分配安全阵列。这不是唯一的安全阵列。