Seite 1 von 1

Ungültiger Speicherzugriff PDFium.DLL

Verfasst: 06.02.2023 13:31
von fabulouspaul
Hallo zusammen,

ich arbeite immer mal wieder mit PDF-Dateien und setze dafür die PDFIUM.DLL ein.
Die alter Version der DLL (Stand 2015) die ich bisher nutze wollte ich mal aktualisieren, weil sie immer mal wieder merkwürdige Fehler produziert.
Also habe ich von GitHub eine kompilierte aktuelle Version heruntergeladen.

Merkwürdigerweise kommt es alle paar Aufrufe zu einem ungültigen Speicherzugriff, den ich mir nicht erklären kann, vielleicht könnt Ihr helfen.

Code: Alles auswählen

; Quelle PDFIUM.DLL   :   https://github.com/bblanchon/pdfium-binaries
; Dokumentation PDFium:   http://cdn01.foxitsoftware.com/pub/foxit/manual/enu/FoxitPDF_SDK20_Guide.pdf

EnableExplicit

Define dateiname.s     ; Name der PDF-Datei
Define pdf_dll.i       ; Handle für die DLL
Define pdf_doc.i       ; Handle für die PDF-Datei
Define buflen.i        ; Buffer-Länge für ausgelesenen Meta-Informationen (Text)
Define *buffer         ; Buffer für ausgelesenen Meta-Informationen (Text)
Define ret.i           ; Rückgabewert
Define version.l       ; PDF-Version

Prototype protoInitLibrary()
Prototype protoDestroyLibrary()
Prototype.i protoGetLastError()
Prototype.i protoLoadDocument(documentpath.p-utf8,password.p-utf8)
Prototype protoCloseDocument(document.i)
Prototype.i protoGetMetaText(document.i, tag.p-ascii, *buffer=#Null, buflen.i=0)
Prototype.i protoGetFileVersion(document.i, *version.long)

; DLL öffnen
pdf_dll = OpenLibrary(#PB_Any, "pdfium.dll")

If pdf_dll = 0
  Debug "Fehler beim Laden der DLL"
  End
EndIf

Define InitLibrary.protoInitLibrary        = GetFunction(pdf_dll, "FPDF_InitLibrary")
Define DestroyLibrary.protoDestroyLibrary  = GetFunction(pdf_dll, "FPDF_DestroyLibrary")
Define GetLastError.protoGetLastError      = GetFunction(pdf_dll, "FPDF_GetLastError")
Define LoadDocument.protoLoadDocument      = GetFunction(pdf_dll, "FPDF_LoadDocument")
Define CloseDocument.protoCloseDocument    = GetFunction(pdf_dll, "FPDF_CloseDocument")
Define GetMetaText.protoGetMetaText        = GetFunction(pdf_dll, "FPDF_GetMetaText")
Define GetFileVersion.protoGetFileVersion  = GetFunction(pdf_dll, "FPDF_GetFileVersion")

; Library initialisieren
InitLibrary()

buflen = 8152
*buffer = AllocateMemory(buflen)

dateiname = OpenFileRequester("PDF auswählen...", "", "PDF-Datei|*.pdf|Alle Dateien|*.*", 0)

If dateiname = ""
  End
EndIf

pdf_doc = LoadDocument(dateiname, "")
If pdf_doc = 0
  Debug "Fehler beim Laden der PDF-Datei: " + dateiname
  Select GetLastError()
    Case 0
      Debug "Kein Fehler"
    Case 1  
      Debug "Unbekannter Fehler"
    Case 2 
      Debug "Datei nicht gefunden / Datei konnte nicht geöffnet werden"
    Case 3 
      Debug "Datei nicht im PDF-Format oder defekt"
    Case 4 
      Debug "Passwort wird benötigt / falsches Passwort"
    Case 5 
      Debug "Sicherheitsschema nicht unterstützt"
    Case 6 
      Debug "Seite nicht gefunden / Fehler im Seiteninhalt"
    Default
      Debug "Sonstiger Fehler"
  EndSelect
  
  End
EndIf

; PDF-Titel
ret = GetMetaText(pdf_doc, "Title", *buffer, buflen) 			; <---- hier kommt es zum Speicherfehler
Debug "PDF-Titel: " + PeekS(*buffer, ret, #PB_Unicode)

; PDF-Autor
ret = GetMetaText(pdf_doc,"Author",*buffer, buflen)
Debug "Autor: " + PeekS(*buffer, ret)

; PDF-Ersteller
ret = GetMetaText(pdf_doc,"Creator",*buffer, buflen) 
Debug "Ersteller: " + PeekS(*buffer, ret)

; PDF-Version
ret = GetFileVersion(pdf_doc, @version)
Debug "PDF-Version: " + StrF(version/10, 2)

CloseDocument(pdf_doc)

DestroyLibrary()
End

Re: Ungültiger Speicherzugriff PDFium.DLL

Verfasst: 06.02.2023 19:54
von ccode_new
Guten Tag,

können Sie noch ein paar weitere Informationen angeben?

Welche PureBasic-Version und welcher Compiler wird verwendet?
Was für ein Windows setzen Sie ein? (XP, Win7, Win8, Win10, Win11, etc.)
Welche DLL-Version haben Sie von der Seite " https://github.com/bblanchon/pdfium-binaries" heruntergeladen?
Kann man die "Memory Access Violation" auf bestimmte geöffnete PDF-Dateien eingrenzen?

Ich habs mal unter Windows 11 mit der DLL der "pdfium-win-x64" - Version mit PureBasic 6.00 LTS getestet und ein paar PDF-Dateien geöffnet.
Bei mir kam es bisher noch zu keinen Fehlern.
Das heißt: Der Titel wurde ordentlich ausgelesen. (wenn ein Titel vorhanden ist)
Ich habe aber auch noch nicht besonders viele veschiedene PDFs getestet.

Re: Ungültiger Speicherzugriff PDFium.DLL

Verfasst: 06.02.2023 23:37
von HeX0R
Seit wann Siezen wir uns denn jetzt hier?
Ich denke Du brauchst PrototypeC

Re: Ungültiger Speicherzugriff PDFium.DLL

Verfasst: 07.02.2023 02:11
von ccode_new
@HeX0R:

Hast recht! Ich kann ja eventuell noch zum Du umswitchen.

Aber: Ich dachte immer:
Eine 64-Bit DLL nutzt immer Fastcall Konventionen, so das zwischen Prototype und PrototypeC nicht weiter unterschieden werden muss.

Re: Ungültiger Speicherzugriff PDFium.DLL

Verfasst: 07.02.2023 11:01
von HeX0R
Das ist richtig, aber ich kann im Ursprungsthread nicht sehen, ob er x64 oder x86 kompiliert hat, daher hatte ich mal eben mit x86 getestet und den selben Effekt gehabt.

Re: Ungültiger Speicherzugriff PDFium.DLL

Verfasst: 07.02.2023 11:21
von fabulouspaul
:allright:
Danke für die Antworten, PrototypeC war der entscheidende Hinweis!

Ich habe jetzt zwar ein weiteres Problem, nämlich dass sich nach einer Menge X an PDF, bei denen ich die Textinformationen auslese, das Programm ohne einen vom Debugger abgefangenen Fehler schliesst, aber das muss ich mir nochmal genauer anschauen. Sieht nach einem Speicherleck aus, aber ich weiß noch nicht ob es in meinem Code oder in der DLL ist. :?