.net 从指针获取缓冲区

.net 从指针获取缓冲区,.net,pointers,intptr,.net,Pointers,Intptr,这是我得到的将最后一个错误放入缓冲区的代码,但我不知道如何将IntPtr转换为我可以读取的内容。。。我只是得到一个很长的数字 /// Return Type: void ///pErrorCode: ABS_DWORD* ///ppErrorMessage: ABS_CHAR** [System.Runtime.InteropServices.DllImportAttribute("bsapi.dll", EntryPoint = "ABSGetLastErrorInfo", C

这是我得到的将最后一个错误放入缓冲区的代码,但我不知道如何将IntPtr转换为我可以读取的内容。。。我只是得到一个很长的数字

/// Return Type: void
///pErrorCode: ABS_DWORD*
///ppErrorMessage: ABS_CHAR**
        [System.Runtime.InteropServices.DllImportAttribute("bsapi.dll", EntryPoint = "ABSGetLastErrorInfo", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static extern void ABSGetLastErrorInfo(ref uint pErrorCode, ref System.IntPtr ppErrorMessage);
这来自手册:

void ABSGetLastErrorInfo(
OUT ABS_DWORD *pErrorCode
OUT const ABS_CHAR **ppErrorMessage
)
Description检索有关上次BSAPI错误的附加信息,该错误发生在当前线程中

输出上的ppErrorMessage设置为指向包含零终止的缓冲区 带有文本消息的字符串

如果没有提供消息,它将指向空字符串,因此调用者会这样做 不需要检查它是否为空

缓冲区由BSAPI管理;不要使用ABSFree来释放它。 请注意,缓冲区仅在执行其他BSAPI调用之前有效 在同一条线上。在下一次调用之后,缓冲区可能会被释放,或者 被BSAPI重复使用。如果你需要记住这个信息,你必须 将其复制到您自己的缓冲区。

定义为

 public static extern void ABSGetLastErrorInfo(ref uint pErrorCode, StringBuilder ppErrorMessage);
StringBuilder
用于输出字符串。看

如果可以输入字符串参数 和/或输出,然后使用 System.StringBuilder类型。这个 StringBuilder类型是一个有用的类 帮助您构建的库类型 有效地使用字符串,而且 非常适合将缓冲区传递给本机 函数填充的函数 代表您输入字符串数据。一旦 函数调用已返回,您需要 只需在服务器上调用ToString StringBuilder对象以获取字符串 反对


更新 正如Jim善意地提到的,将
StringBuilder
定义为ref

public static extern void ABSGetLastErrorInfo(ref uint pErrorCode, ref StringBuilder ppErrorMessage);

当我像这样将其称为UInteger Dim errorInfo As StringBuilder=Nothing ABSGetLastErrorInfo(代码,errorInfo)的Dim代码时,应用程序会无错误地崩溃。否,创建一个新的StringBuilder并将其传递给函数。调用后,stringbuilder应返回字符串。结果相同:(仍然crashingI认为
StringBuilder
应该通过引用进行传递。
ref StringBuilder ppErrorMessage
。如果这不起作用,那么将其设置为
ref IntPtr ppErrorMessage
,当您得到值时,调用
封送程序.PtrToStringAnsi