0

アンマネージ C++ DLL で関数を呼び出そうとしています。stackoverflow の投稿を検索しています。

.h ファイルで次のように宣言します。

extern int SomeDLLMethod(const char **data, int *count);

データは文字列です

C# で次のように宣言しました。

[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int SomeDLLMethod(IntPtr data, ref int count);

次に、次のように C# から呼び出すことができます。

unsafe
{
    fixed (byte* buffer = new byte[MAX_LENGTH])
    {
        IntPtr ptr = new IntPtr(buffer);
        int count = 0;
        var retVal = SomeDLLMethod(ptr, ref count);
        var dataString = Marshal.PtrToStringAuto(ptr);
        Console.WriteLine(dataString);
     }
 }

呼び出しは成功し、バッファにはカウントとデータがありますが、この値を C# 文字列に戻すにはどうすればよいですか?

マーシャルメソッドは私にゴミを与えています

4

1 に答える 1

2

質問には 100% 確信できる十分な情報がありませんが、これが必要だと思います。

[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int SomeDLLMethod(ref IntPtr data, ref int count);
.....
IntPtr data;
int count;
int retval = SomeDLLMethod(ref data, ref count);
string str = Marshal.PtrToStringAnsi(data, count);

理想的には、このような質問をするときは、ネイティブ関数の完全なドキュメントを含める必要があります。これは、char** がさまざまなことを意味する可能性があるためです。

ここでの char** は、DLL によって割り当てられた null で終わる C 文字列へのポインターであると想定しています。あなたのコードは、呼び出し元がバッファーを割り当てることを前提としていますが、そうであれば、char** ではなく char* が表示されると予想されます。

于 2012-04-11T06:37:37.680 に答える