RE:reservar espacio en memoria
Bueno, a ver, es que VB soporta el ABI de C (Application Binary Interface), por lo que se puede comunicar con cualquier DLL escrita en C. Para eso están las palabras reservadas Declare AlgunaFuncion Lib "libreria.dll" Alias "AlgunaFuncionInterna" (Parámetros) As TipoDato.
Gracias a esto, se puede emplear el API de Win32, y con eso puedes emplear GlobalAlloc, como mencioné en un post anterior. A lo que me refería era que de forma nativa no es posible. Ahora bien, GlobalAlloc lo puedes emplear, y sí puedes ubicar memoria, pero como VB no tiene soporte nativo para esto, no sé que uso le podrías dar, realmente.
Finalmente, un apunte más a esto del BSTR. En C, una cadena de texto (aka char*) es un array de caracteres (es decir, todos los caracteres vienen en direcciones de memoria contiguas) que termina en un caracter nulo. Sin embargo, para algunas cuestiones de Windows, es posible que una cadena de texto tenga más de un caracter nulo entre la cadena de texto (por ejemplo, al aplicar soporte Unicode). Por ello es que Windows define el tipo de dato BSTR, el cuál puede tener caracteres nulos en el cuerpo mismo de la cadena de texto. De hecho, un BSTR termina siempre con dos caracteres nulos.
Debido a que este soporte es empleado en Windows, y es el recomendado por COM, VB lo soporta de forma nativa. Es decir, el equivalente en C de:
Dim str As String
str = "Hola mundo"
Sería:
BSTR str;
str = SysAllocString(_T("Hola Mundo"));
...
SysFreeString(str);
Por ello, cuando hablamos de interoperabilidad entre C y VB, para que éste último pueda leer cadenas de texto, tienes que emplear el tipo de dato BSTR. Es una lata, de hecho. Cuando haces una librería COM en C++ tienes que andar lidiando con todo esto. Por ende, si quieres que tu librería maneje cadenas de texto con VB, tienes que cambiarlas para que soporten BSTR en lugar de char* ó wchar_t*.
Saludos.