【问题标题】:Getting a buffer from a pointer从指针获取缓冲区
【发布时间】:2011-05-03 15:40:40
【问题描述】:

这是我将最后一个错误放入缓冲区的代码,但我不知道如何将 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
)

描述 检索有关上一个 BSAPI 错误的附加信息,该错误发生在当前线程中。

ppErrorMessage 在输出时,它被设置为指向一个包含零终止的缓冲区 带有文本消息的字符串。

如果没有提供消息,它指向空字符串,所以调用者这样做 不需要检查它是否为NULL。

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

【问题讨论】:

    标签: .net pointers intptr


    【解决方案1】:

    定义为

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

    StringBuilder 用于输出字符串。见here

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


    更新

    正如 Jim 提到的,将 StringBuilder 定义为 ref。

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

    【讨论】:

    • 当我这样称呼它时 Dim Code As UInteger Dim errorInfo As StringBuilder = Nothing ABSGetLastErrorInfo(Code, errorInfo) 应用程序崩溃而没有错误。
    • 不,创建一个新的字符串生成器并将其传递给函数。调用后,stringbuilder 应该会返回您的字符串。
    • 相同的结果 :( 仍然崩溃
    • 我相信StringBuilder 应该通过引用传递。 ref StringBuilder ppErrorMessage.
    • 如果这不起作用,则将其设为ref IntPtr ppErrorMessage,当您获得返回值时调用Marshal.PtrToStringAnsimsdn.microsoft.com/en-us/library/7b620dhe.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2012-06-09
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    相关资源
    最近更新 更多