Получение буфера из указателя - PullRequest
0 голосов
/ 03 мая 2011

Это код, который я получил, чтобы получить последнюю ошибку в буфер, но я понятия не имею, как преобразовать 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. Если вам нужно запомнить сообщение, вы должны скопируйте его в свой собственный буфер.

1 Ответ

2 голосов
/ 03 мая 2011

Определить как

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

StringBuilder используется для строк вывода. Смотри здесь .

Если можно ввести строковый параметр и / или вывод, затем используйте Тип System.StringBuilder. Тип StringBuilder - полезный класс тип библиотеки, которая поможет вам построить струны эффективно, и это происходит с отлично подходит для передачи буферов нативным функции, которые функции заполняют строковые данные от вашего имени. Однажды Вызов функции вернулся, вам нужно только вызов ToString на Объект StringBuilder для получения строки объект.


UPDATE

Как упоминал Джим Кинди, определите StringBuilder как ref

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