2

ピンボークコードを使用してC関数を呼び出そうとしています。この関数は、バッファーをデータで満たします。

構造は、長さのDWORDとして設定され、その後に文字列が続きます。IntPtrから文字列を抽出するにはどうすればよいですか?

 IntPtr buffer = Marshal.AllocHGlobal(nRequiredSize);
 PInvokedFunction(buffer, nRequiredSize);
 string s = Marshal.PtrToStringAuto(buffer + 4); //this is an error.
 Marshal.FreeHGlobal(buffer);
4

3 に答える 3

3

これを行う必要があります:

IntPtr sBuffer = new IntPtr( buffer.ToInt64() + 4 );
string s = Marshal.PtrToStringAuto( sBuffer );

したがって、コードは64ビットで安全です。

于 2008-10-18T22:30:48.390 に答える
0

UnmanagedMemoryStreamの使用は少しハックのようですが、私が思いついた最高のものは次のとおりです。

 IntPtr buffer = Marshal.AllocHGlobal((int)nRequiredSize);
 PInvokedFunction(buffer, nRequiredSize);
 UnmanagedMemoryStream memStream = new UnmanagedMemoryStream(buffer.ToPointer(), nRequiredSize);
 memStream.Seek(4, SeekOrigin.Begin);
 IntPtr ptr = new IntPtr(memStream.PositionPointer);
 string s = Marshal.PtrToStringAuto(ptr);
 Marshal.FreeHGlobal(buffer);
于 2008-10-18T21:58:44.430 に答える
0

これはうまくいくように見えましたが、 Matt Ellis の Answer の方が好きだと思います。

[DllImport] の IntPtr を byte[] に変更しました。

 //allocate the buffer in .Net
 byte[] buffer = new byte[nRequiredSize];

 //call the WIN32 function, passing it the allocated buffer
 PInvokedFunction(buffer);

 //get the string from the 5th byte
 string s = Marshal.PtrToStringAuto(Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 4));
于 2008-10-18T23:15:40.843 に答える