Rumah > pembangunan bahagian belakang > Tutorial Python > Adakah sesiapa cuba mengemas kini pengikatan Python LibHaru kepada Python 3.9 (64-bit)?

Adakah sesiapa cuba mengemas kini pengikatan Python LibHaru kepada Python 3.9 (64-bit)?

WBOY
Lepaskan: 2024-02-09 08:54:27
ke hadapan
712 orang telah melayarinya

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

Kandungan soalan

Saya menjalankan Python 3.9, 64-bit, dan telah menggunakan VS 2022 untuk menyusun libharu dan beberapa sambungan ke dalam DLL, termasuk libpng. Selepas menambah pelarasan kod minimum untuk mencari DLL masa jalan VS (libhpdf), DLL boleh dimuatkan ke dalam Python. dll dan nampaknya berfungsi (hanya 5 fail .py dalam berkas) Saya telah membina DLL dengan PTRACE didayakan untuk menjejak kemajuan. Demo C juga telah dibina secara dinamik menggunakan DLL ini dan semuanya berfungsi, menghasilkan PDF.

Saya cuba menjalankan contoh demo python yang disertakan dalam pengikatan, arc_demo.py Ingin menjana fail PDF yang sama

Saya boleh katakan bahawa semuanya berfungsi dengan baik sehingga menambah baris daripada dokumentasi: pdf = HPDF_New (error_handler, NULL) Output serupa dengan jejak yang diperoleh menggunakan versi C yang disusun contoh.

Tetapi... var "pdf" bukanlah seperti yang diharapkan oleh HP_AddPage() kerana apabila panggilan seterusnya dikeluarkan, halaman itu ditambahkan page = HPDF_AddPage (pdf) Saya terjumpa ini: **ctypes.ArgumentError:参数 1:<class 'OverflowError'>:int 太长,无法转换**

Saya rasa ini mungkin ada kaitan dengan pengikatan asal yang sedang dibina dan diuji dengan 32-bit sahaja. Satu lagi suspek ialah ported ctypes.

Jadi sekarang saya mengubah suai pengikatan, terutamanya hpdf.py. Pada masa ini bergelut dengan Python ke interkomunikasi DLL, menyemak bahawa ctypes mengendalikan perkara seperti yang diharapkan. Menggunakan byref ,将 *pdf * 转换为 c_void_p,... tidak berjaya. Jika panggilan dilakukan melalui ref(c_void_p(pdf)) saya menyingkirkan ralat tetapi tidak dapat mengakses kandungan struktur HPDF_Doc dengan betul

Ada cadangan? Mungkin anda boleh membantu? Pendekatan perbandingan untuk menyahpepijat Python menggunakan DLL berasaskan C?

Terima kasih, Ignacio

PS: Kelas akhirnya akan ditulis untuk dalaman PDF Haru. Tetapi ini berlaku selepas saya dapat menjalankan contoh python tanpa ralat.


Jawapan betul


if/python/hpdf.py中的ctypes接口没有为所有函数定义.argtypes。对于 64 位句柄和指针来说,为每个函数定义正确的参数类型尤其重要。最初的开发人员可能不明白这一点,如从 windll 转换为 cdll 接口所示。 windll 使用 __stdcall konvensyen panggilan dan perlu tahu saiz parameter.

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

#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
Salin selepas log masuk

ctypes 假设传递给 hpdf_addpage 的参数是 c_int 因为 to 没有 argtypes。句柄值是 >32 位,因此出现错误。理想情况下,所有函数都应显式声明其参数类型,以便 ctypes Boleh melakukan semakan taip dan marshal (menukar) parameter dengan betul daripada objek python kepada jenis c, contohnya:

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
Salin selepas log masuk

Sila ambil perhatian bahawa jenis parameter mestilah berdasarkan ctypes 类型。您必须仔细跟踪参数并为每个函数声明 .argtypes.

Atas ialah kandungan terperinci Adakah sesiapa cuba mengemas kini pengikatan Python LibHaru kepada Python 3.9 (64-bit)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan