0

この C++ dll 呼び出しから C# のエラー文字列を読み取るにはどうすればよいですか?

//
//  PARAMETERS:
//      objptr
//          Pointer to class instance.
//
//      pBuffer
//          Pointer to buffer receiving NULL terminated error message string.   
//          If this value is zero, the function returns the required buffer size, in bytes,
//          and makes no use of the pBuffer. 
//
//      nSize
//          Size of receiving buffer.
//          If this value is zero, the function returns the required buffer size, in bytes,
//          and makes no use of the pBuffer. 
//
//  RETURN VALUES:
//      If pBuffer or nSize is zero, the function returns the required buffer size, in bytes.
//      If the function succeeds, the return value is number of bytes copied into pBuffer.
//      If function fails return value is 0.
//
extern unsafe int GetError(uint objptr, byte* pBuffer, int nSize);

ありがとう!

4

3 に答える 3

4

データ型を byte* から IntPtr に変更すると、次のように動作する可能性があります。

Marshal.PtrToStringAnsi

または、stringコンストラクターの 1 つ (そのうちの 1 つにはEncodingパラメーターも含まれます):

文字列コンストラクタ

于 2009-12-27T10:20:40.583 に答える
3
byte[] buffer = new byte[1000];
int size;
unsafe
{
  fixed ( byte* p = buffer )
  {
    size = GetError( ???, p, buffer.Length ); 
  }
}
string result = System.Text.Encoding.Default.GetString( buffer, 0, size );
于 2009-12-27T10:50:44.290 に答える
0

Marshal.AllocHGlobal(int)Marshal.PtrToStringAuto(IntPtr, int)でしょうか?

すでにp/invoke またはその他の策略を使用して強制byte*していると想定しているため、コードコンテキストがあれば便利です。IntPtr

基本的には、関数を呼び出してバッファ サイズを取得し、 を使用してバッファを割り当て、AllocHGlobal()再度呼び出し、文字列を読み取り、( を使用してMarshall.FreeHGlobal(IntPtr)) バッファを解放します。もちろん、これは Marshall のアロケータを使用できることを前提としています。

于 2009-12-27T10:24:41.007 に答える