我想与一个由Delphi创建的DLL库进行交互。在C++中,我可以很好地调用它:
for(int y = 1; y <= 12; y++)
{
char * chanName = (char *) malloc(21);
memset(chanName,0,21);
channelName(y,20,chanName);
...
}
channelName
是类型定义,定义如下:typedef int (CALLBACK* ChannelName)(int,int,char*);
现在我正在尝试用C#完成相同的操作。我搜索并发现StringBuilder
通常被用作DLL函数的char指针。这里是我声明函数的方式:
[DllImport("myDLL.dll")]
public static extern int ChannelName(int x, int y, StringBuilder z);
这是我尝试调用它的方式:
for (int x = 0; x < 12; x++)
{
StringBuilder b = new StringBuilder(100);
DLLInterface.ChannelName(x+1, b.Length, b);
Console.WriteLine(b.ToString());
}
这只是让控制台打印出无意义的字符,例如:
☺ §
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
我记得在C++中遇到了类似的问题,所以我用memset
将我malloc
的内存清零。我试图在C#中找到一个相应的方法,但也许这是与StringBuilder
有关的问题?如果我的问题不是很清楚,我只是想能够将字符串传递给我的函数,让函数填充它,然后打印出来。在C#中,字符串是不可变的,没有好的指针选项,这就是为什么我正在尝试使用StringBuilder
的原因。
string
。 - Ajayref string z
,然后将字符串 "" 作为 ref 传递进去,结果打印出了空行。 - telkins