Вопрос

Настройка

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

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. Woops. Я забыл pin_ptr указатель документа.

Эта проблема

Когда я POP_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);
}

Я также попробовал буфер Punning [0], но вызывает исключение аксессуаров в Getmetatext.

Вопрос

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top