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
0 になります。C# で同等のものを見つけようとしましたが、StringBuilder
代わりに問題が発生した可能性があります。私の質問があまり明確でない場合は、関数に文字列を渡し、関数に入力させてから出力できるようにしたいだけです。C# では文字列は不変であり、適切なポインター オプションが存在しないため、試していStringBuilder
ます。