usar run recolector objeto net magazine destruir destructores como collector collection basura memory-management com vb6

memory management - run - ¿Cómo administro adecuadamente la memoria cuando uso objetos COM en VB?



recolector de basura o garbage collection (3)

¿Alguien puede explicar cómo se produce la asignación / desasignación de memoria cuando pasamos valores entre el objeto COM y VB?

Mis preocupaciones son: 1.

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

¿Necesitamos liberar la memoria asignada para los parámetros anteriores dentro del objeto COM?

2.

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

En este caso, ¿el VB se ocupará de liberar memoria para los valores de retorno COM? (El objeto COM asigna memoria para estos valores de retorno)

3.

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

Una vez que el evento se maneja dentro de VB, ¿VB tendrá cuidado de la desasignación de la memoria de los parámetros?

Aprecio tu ayuda.

Gracias


VB6 tiene tres casos de declaración de parámetro de cadena: ByVal param As String , ByRef param As String y Function() As String . El primero en los mapas IDL en [in] BSTR param , el segundo en [in, out] BSTR *param , el tercero en [out, retval] BSTR *retval .

No hay forma de que VB6 pueda declarar [in] BSTR * , ni [out] BSTR * params pero aún puede consumir estos, es decir, puede invocar métodos (en una clase de VC) que tiene params declarados como out-only o cualquier otro IDL compatible camino.

También tenga en cuenta que BSTR sí mismo es un puntero typedef''d, algo así como wchar_t * , entonces BSTR * es realmente wchar ** . El IDL necesita un puntero para los params, por lo que no puede declarar [out] int param y [out] BSTR param también es extraño.

Una vez [in] BSTR * confusión es clara (es innecesario el doble indirecto requerido para los params pero no solo para la entrada), la regla simple es que una vez que tienes un * en la declaración de param entonces el que llama tiene que liberarlo después del método llamar si ya no es NULO.

[in, out] SAFEARRAY(BSTR)* pArray asigna a ByRef pArray() As String en VB6 y no puede cambiar esto a ByVal es decir, * es requerido por VB6 por lo que no puede estar solo y la persona que llama tiene para desasignar la matriz segura. El no es un arreglo seguro solo.


[in] parámetros deben ser asignados por la persona que llama y liberados por la persona que llama a menos que la documentación de la API especifique lo contrario.

El parámetro [in, out] es menos claro, ya que este es un BSTR * es posible que se libere el BSTR que pasa y se devuelve un BSTR diferente, por lo que debe liberar el BSTR que se devuelve en lugar del que aprobó en.

[out] y [out, retVal] , implican una transferencia de propiedad de la memoria, la función asigna la memoria y la persona que llama es responsable de liberar la memoria.

Para BSTR en C / C ++ COM usaría SysAllocString y SysFreeString para asignar y liberar.