Pasando StringBuilder a la función DLL esperando el puntero de caracteres
Estoy tratando de interactuar con una biblioteca DLL creada en Delphi. En C ++, hice esta llamada perfectamente bien:
for(int y = 1; y <= 12; y++)
{
char * chanName = (char *) malloc(21);
memset(chanName,0,21);
channelName(y,20,chanName);
...
}
DóndechannelName
es el tipo definido comotypedef int (CALLBACK* ChannelName)(int,int,char*);
Ahora estoy tratando de hacer lo mismo en C #. He buscado y encontrado queStringBuilder
Se usa comúnmente como un puntero de caracteres para las funciones DLL. Así es como declaré mi función:
[DllImport("myDLL.dll")]
public static extern int ChannelName(int x, int y, StringBuilder z);
Y así es como estoy tratando de llamarlo:
for (int x = 0; x < 12; x++)
{
StringBuilder b = new StringBuilder(100);
DLLInterface.ChannelName(x+1, b.Length, b);
Console.WriteLine(b.ToString());
}
Esto es solo hacer que la consola imprima jibberish, por ejemplo:
☺ §
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
Recuerdo que me encontré con un problema similar en C ++, por lo quememset
el recuerdo que yomalloc
a 0. Traté de encontrar un equivalente en C #, pero tal vez es un problema con elStringBuilder
¿en lugar? En caso de que mi pregunta no sea muy clara, solo quiero poder pasar una cadena a mi función, hacer que la función la llene y luego imprimirla. Las cadenas son inmutables en C # y no existen buenas opciones de punteros, por eso lo estoy intentandoStringBuilder
.