Heim >Backend-Entwicklung >Python-Tutorial >Hat jemand versucht, die Python-Bindungen von LibHaru auf Python 3.9 (64-Bit) zu aktualisieren?

Hat jemand versucht, die Python-Bindungen von LibHaru auf Python 3.9 (64-Bit) zu aktualisieren?

WBOY
WBOYnach vorne
2024-02-09 08:54:27706Durchsuche

有人尝试将 LibHaru 的 Python 绑定更新为 Python 3.9(64 位)吗?

Frageninhalt

Ich verwende Python 3.9, 64-Bit, und habe VS 2022 verwendet, um libharu und einige Erweiterungen in eine DLL zu kompilieren, einschließlich libpng. Nach dem Hinzufügen minimaler Codeanpassungen zum Auffinden der VS-Laufzeit-DLL (libhpdf) kann die DLL in Python geladen werden. dll-Abhängigkeit und scheint zu funktionieren (nur 5 .py-Dateien im Paket) Ich habe eine DLL mit aktiviertem PTRACE erstellt, um den Fortschritt zu verfolgen. Mit dieser DLL wurden auch C-Demos dynamisch erstellt, die alle funktionieren und PDFs generieren.

Ich versuche, das in der Bindung enthaltene Python-Demobeispiel arc_demo.py auszuführen Möchten Sie dieselbe PDF-Datei generieren?

Ich kann sagen, dass alles gut funktioniert, bis ich die Zeile aus der Dokumentation hinzufüge:

Ausgabe ähnlich der Ablaufverfolgung, die mit der kompilierten C-Version des Beispiels erhalten wurde. pdf = HPDF_New (error_handler, NULL)

Aber... var „pdf“ ist nicht das, was HP_AddPage() erwartet, denn beim nächsten Aufruf wird die Seite hinzugefügt

Ich bin auf Folgendes gestoßen: page = HPDF_AddPage (pdf)**ctypes.ArgumentError:参数 1:a04cf49bbeb5568f1f5e32599834036a:int 太长,无法转换**

Ich denke, das könnte etwas damit zu tun haben, dass die ursprünglichen Bindungen nur mit 32-Bit erstellt und getestet wurden. Ein weiterer Verdächtiger sind portierte Ctypes.

Jetzt ändere ich also die Bindungen, hauptsächlich

hpdf.py. Ich habe derzeit Probleme mit der Kommunikation zwischen Python und DLL und überprüfe, ob ctypes die Dinge wie erwartet verarbeitet. Mit ...kein Glück. Wenn der Aufruf über ref(c_void_p(pdf)) erfolgt, werde ich den Fehler beseitigen, kann aber nicht richtig auf den Inhalt der HPDF_Doc-Struktur zugreifen byref ,将 *pdf * 转换为 c_void_p

Irgendwelche Vorschläge? Könnten Sie vielleicht helfen? Vergleichende Ansätze zum Debuggen von Python mithilfe einer C-basierten DLL?

Danke, Ignacio

PS: Irgendwann werden Kurse für Haru PDF-Interna geschrieben. Dies geschieht jedoch, nachdem ich das Python-Beispiel ohne Fehler ausführen kann.


Richtige Antwort


Aufrufkonvention und Sie müssen die Parametergröße kennen. if/python/hpdf.py中的ctypes接口没有为所有函数定义.argtypes。对于 64 位句柄和指针来说,为每个函数定义正确的参数类型尤其重要。最初的开发人员可能不明白这一点,如从 windll 转换为 cdll 接口所示。 windll 使用 __stdcall

Zum Beispiel ist

definiert als: hpdf_doc 被定义为 hpdf_handle,它被定义为 ctypes.c_void_p。这是 64 位操作系统上的 64 位指针。 hpdf_newhpdf_addpage

#hpdf_doc hpdf_new (hpdf_error_handler user_error_fn, void *user_data)
hpdf_new=haru.hpdf_new
hpdf_new.restype=hpdf_doc

#hpdf_page hpdf_addpage (hpdf_doc pdf)
hpdf_addpage=haru.hpdf_addpage
hpdf_addpage.restype=hpdf_page

Kann Typprüfungen durchführen und Parameter von Python-Objekten korrekt in C-Typen marshalieren (konvertieren), zum Beispiel: ctypes 假设传递给 hpdf_addpage 的参数是 c_int 因为 to 没有 argtypes。句柄值是 >32 位,因此出现错误。理想情况下,所有函数都应显式声明其参数类型,以便 ctypes

HPDF_AddPage.argtypes = HPDF_Doc,  # must be a list or tuple...comma makes this a 1-tuple.
HPDF_New.argtypes = HPDF_Error_Handler, c_void_p

Bitte beachten Sie, dass Parametertypen auf

basieren müssen. ctypes 类型。您必须仔细跟踪参数并为每个函数声明 .argtypes

Das obige ist der detaillierte Inhalt vonHat jemand versucht, die Python-Bindungen von LibHaru auf Python 3.9 (64-Bit) zu aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen