有人可以解释当我们在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的参数存储器的取消分配是否会被处理?
感谢您的帮助。
谢谢
答案 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,您可以使用SysAllocString
和SysFreeString
来分配和释放。
答案 2 :(得分:0)
VB6有三种字符串参数声明 - ByVal param As String
,ByRef param As String
和Function() 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且调用者有解除分配安全阵列。这不是唯一的安全阵列。