.net 从指针获取缓冲区
这是我得到的将最后一个错误放入缓冲区的代码,但我不知道如何将IntPtr转换为我可以读取的内容。。。我只是得到一个很长的数字.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
/// 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
: