Ungültiger Speicherzugriff PDFium.DLL

Für allgemeine Fragen zur Programmierung mit PureBasic.
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Ungültiger Speicherzugriff PDFium.DLL

Beitrag 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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Ungültiger Speicherzugriff PDFium.DLL

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Ungültiger Speicherzugriff PDFium.DLL

Beitrag von HeX0R »

Seit wann Siezen wir uns denn jetzt hier?
Ich denke Du brauchst PrototypeC
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Ungültiger Speicherzugriff PDFium.DLL

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Ungültiger Speicherzugriff PDFium.DLL

Beitrag 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.
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: Ungültiger Speicherzugriff PDFium.DLL

Beitrag 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. :?
Antworten