Przekazywanie StringBuilder do funkcji DLL oczekującej wskaźnika char
Próbuję współdziałać z biblioteką DLL utworzoną w Delphi. W C ++ wywołałem to doskonale:
for(int y = 1; y <= 12; y++)
{
char * chanName = (char *) malloc(21);
memset(chanName,0,21);
channelName(y,20,chanName);
...
}
GdziechannelName
jest typ zdefiniowany jakotypedef int (CALLBACK* ChannelName)(int,int,char*);
Teraz próbuję zrobić to samo w C #. Szukałem i znalazłem toStringBuilder
jest powszechnie używany jako wskaźnik znaków dla funkcji DLL. Oto jak zadeklarowałem swoją funkcję:
[DllImport("myDLL.dll")]
public static extern int ChannelName(int x, int y, StringBuilder z);
Oto jak to nazywam:
for (int x = 0; x < 12; x++)
{
StringBuilder b = new StringBuilder(100);
DLLInterface.ChannelName(x+1, b.Length, b);
Console.WriteLine(b.ToString());
}
Sprawia to, że konsola drukuje jibberish, na przykład:
☺ §
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
Pamiętam, że wpadłem na podobny problem w C ++, dlatego teżmemset
pamięć, którą jamalloc
do 0. Próbowałem znaleźć odpowiednik w C #, ale być może jest to problem zStringBuilder
zamiast? W przypadku, gdy moje pytanie nie jest jasne, po prostu chcę móc przekazać ciąg do mojej funkcji, wypełnić tę funkcję, a następnie wydrukować. Ciągi są niezmienne w C # i nie istnieją żadne dobre opcje wskaźnika, dlatego próbujęStringBuilder
.