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构造函数(其中一个还包括一个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)也许?

一些代码上下文会很好,因为我假设您已经强制byte*使用IntPtrp/invoke 或其他一些技巧。

基本上,调用你的函数来获取缓冲区大小,使用分配缓冲区AllocHGlobal(),再次调用它,读入字符串,然后释放缓冲区(使用Marshall.FreeHGlobal(IntPtr))。当然,这是假设您可以使用 Marshall 的分配器。

于 2009-12-27T10:24:41.007 回答