pin_ptr родной void * помощь - PullRequest
       20

pin_ptr родной void * помощь

1 голос
/ 28 октября 2010

Настройка

У меня есть PDF API, который имеет встроенную функцию, которая определена ниже.

typdef void* PDF_DOCUMENT;
unsigned long PDF_GetMetaText(PDF_DOCUMENT document,
                              const char tag, 
                              void* buffer, 
                              unsigned long bufferlen)

//Calling it "natively" in C++/CLI function to get the PDF Creator tag
WCHAR result[32];
void* pdoc = PDF_LoadDoc("C:\test.pdf");
int numChars = PDF_GetMetaText(pdoc, "Creator", result, 32);
PDF_CloseDoc(pdoc);

если я вызываю приведенный выше код в моей функции-оболочке C ++ / CLI, он возвращает правильную строку, но выдает AccessViolationException, когда я вызываю PDF_CloseDoc. Гребенки. Я забыл pin_ptr указатель документа.

Проблема

Когда я pin_ptr pdoc, я могу успешно вызывать эти встроенные функции, однако в буфере больше не содержится моя строка, когда возвращается PDF_GetMetaText.

String^ Wrapper::GetCreator(String^ filename)
{
   WCHAR buffer[32];
   void *pdoc = PDF_LoadDoc(SystemStringToCStr(filename));
   pin_ptr<void*> p = &pdoc; //added
   int numPages = PDF_GetMetaText(p, "Creator", buffer, 32);
   PDF_CloseDocument(p); //doesnt crash, but at this line buffer is an empty string

   return gcnew String(buffer);
}

Я также попытался закрепить буфер [0], но это вызывает исключение нарушения прав доступа в GetMetaText.

Вопрос

Я не могу сказать, что происходит в GetMetaText, поэтому я не уверен, что происходит с pdoc. Любые предложения к вышеуказанному коду?

1 Ответ

2 голосов
/ 28 октября 2010

Это не имеет никакого смысла.Вы можете закрепить только управляемые объекты, возвращаемое значение PDF_LoadDoc () не похоже на управляемый объект для меня.То же самое относится и к результату , это не управляемый array<WCHAR>, а просто простой ванильный массив C, который выделяется в кадре стека.К сожалению, pin_ptr <> не жалуется на это.

Массив result может получить «пустой», только если код топит кадр стека.Что вы можете диагностировать, установив точку останова данных на первом элементе.Кстати, SystemStringToCStr () выглядит как кандидат.Это не может работать без освобождения буфера для нативной строки.Другой кандидат - объявления функций PDF API.Обратите внимание на значение регистра ESP и убедитесь, что оно не меняется.Если это так, стек становится несбалансированным, потому что у вас нет правильного соглашения о вызовах.Обычно это __stdcall для экспорта DLL.

...