Passando StringBuilder para função DLL esperando ponteiro char
Estou tentando interagir com uma biblioteca DLL criada no Delphi. Em C ++, fiz essa ligação perfeitamente bem:
for(int y = 1; y <= 12; y++)
{
char * chanName = (char *) malloc(21);
memset(chanName,0,21);
channelName(y,20,chanName);
...
}
OndechannelName
é tipo definido comotypedef int (CALLBACK* ChannelName)(int,int,char*);
Agora estou tentando fazer a mesma coisa em c #. Eu procurei e descobri queStringBuilder
é comumente usado como um ponteiro de caractere para funções DLL. Aqui está como eu declarei minha função:
[DllImport("myDLL.dll")]
public static extern int ChannelName(int x, int y, StringBuilder z);
E aqui está como eu estou tentando chamar isso:
for (int x = 0; x < 12; x++)
{
StringBuilder b = new StringBuilder(100);
DLLInterface.ChannelName(x+1, b.Length, b);
Console.WriteLine(b.ToString());
}
Isso é apenas fazer o console imprimir um lixo, por exemplo:
☺ §
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
Lembro-me de ter encontrado um problema semelhante em C ++, e é por isso quememset
a memória que eumalloc
para 0. Eu tentei encontrar um equivalente em c #, mas talvez seja um problema com oStringBuilder
em vez de? Caso minha pergunta não seja muito clara, eu só quero poder passar uma string para minha função, fazer com que a função a preencha e depois imprimi-la. As strings são imutáveis em C # e não existem boas opções de ponteiro, e é por isso que estou tentandoStringBuilder
.