Frage

Das Setup

Ich habe einen PDF-API, die eine native Funktion hat, die unten definiert ist.

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);

wenn ich den obigen Code in meine C ++ / CLI Wrapper-Funktion aufrufen, gibt es die richtige Zeichenfolge aber wirft einen Access wenn ich PDF_CloseDoc nennen. WOOPS. Ich habe vergessen, den Zeiger das Dokument pin_ptr.

Das Problem

Als ich PDOC pin_ptr, ich diese nativen Funktionen erfolgreich aufrufen können, aber der Puffer nicht mehr enthält meine Zeichenfolge, wenn PDF_GetMetaText zurückkehrt.

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);
}

Ich habe auch versucht, Pinning buffer [0], aber das verursacht eine Ausnahme bei Access GetMetaText.

Die Frage

Ich kann nicht sagen, was in GetMetaText geschieht, so bin ich nicht sicher, was zu PDOC ist happing. Irgendwelche Vorschläge zu den obigen Code?

War es hilfreich?

Lösung

Das macht keinen Sinn. Sie können nur verwaltete Objekte Pin, den Rückgabewert von PDF_LoadDoc () sicher, sieht nicht aus wie ein verwaltetes Objekt zu mir. Das Gleiche gilt für Ergebnis , es ist nicht ein verwaltetes array<WCHAR>, nur ein Plain-Vanilla-C-Array, das auf dem Stapelrahmen zugeordnet wird. Leider pin_ptr <> nicht darüber beschweren.

Die Ergebnis Array konnte nur 'leer', wenn Code, um den Stapelrahmen stampft. Was Sie, indem Sie einen Datenhaltepunkt auf dem ersten Element diagnostizieren. FWIW, SystemStringToCStr () sieht aus wie ein Kandidat. Dies kann nicht funktionieren, ohne den Puffer für die native String irgendwo freigibt. Ein weiterer Kandidat ist die PDF-API-Funktion Erklärungen. Achten Sie auf den Wert des ESP-Registers und stellen Sie sicher, es ändert sich nicht. Ist dies der Fall, ist der Stapel unausgewogen, weil Sie nicht über die richtige Aufrufkonvention haben. Welches ist in der Regel __stdcall für DLL-Exporte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top