我运行的是Python3.9,64位,并且已经将libharu和一些扩展编译成DLL,包括使用VS2022的libpng.在添加了最少的代码调整后,DLL可以加载到Python中,以找到libhpdf.dll所依赖的VS运行时DLL,并且似乎可以工作(绑定中只有5个.py文件) 我已经构建了dll,使ptrace能够跟踪进度.我还用该DLL动态构建了C语言演示,它们都能正常工作,生成PDF.

我正在try 运行绑定中包含的一个pythondemo示例,arc_demo.py 希望生成与之相同的PDF文件

我可以断定一切正常,直到下面这行代码添加了一个文档: pdf = HPDF_New (error_handler, NULL)个 与使用编译后的C版本的样例获得的跟踪输出类似.

但是...变量"pdf"不是HP_AddPage()所期望的,因为在发出下一个调用时,要添加一个页面 page = HPDF_AddPage (pdf)个 我遇到了这样的情况: **ctypes.ArgumentError: argument 1: <class 'OverflowError'>: int too long to convert**

我认为这可能与原始绑定仅用32位构建和测试的事实有关.另一个嫌疑人是移植的ctype.

所以现在我正在修改绑定,主要是hpdf.py. 目前,正在与Python到DLL的交互进行斗争,判断ctype是否按预期处理.使用byref ,将*pdf*转换为c_void_p,...运气不好.如果调用是由ref(c_void_p(Pdf))完成的,但无法正确访问HPDF_Doc struct 的内容,则可以消除错误

有什么建议吗?你可能会给予帮助吗?调试Python和基于C的动态链接库的对比方法?

谢谢, 伊格纳西奥

PS:最终会为Haru PDF内部 struct 编写类.但这将在稍后,在我能够正确运行一个Python样例之后进行.

推荐答案

if/python/hpdf.py中的ctypes接口没有为所有功能定义.argtypes. 对于64位句柄和指针来说, for each 函数定义适当的参数类型尤为重要. 最初的开发人员可能没有理解这一点,因为从WinDLL转换到CDLL接口. WinDLL使用__stdcall调用约定,需要知道参数大小.

例如,HPDF_Doc被定义为HPDF_HANDLE,而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

ctypes假定传递给HPDF_AddPage的参数是c_int,因为TO没有参数类型.句柄的值为>;32位,因此出现错误.理想情况下,所有函数都应该显式声明它们的参数类型,这样ctypes就可以进行类型判断,并将参数从Python对象正确地封送(转换)为C类型,例如:

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

请注意,参数类型必须基于ctypes个类型.您必须仔细跟踪参数并 for each 函数声明.argtypes.

Python相关问答推荐

Pandas基于另一列的价值的新列

如何最好地处理严重级联的json

有没有办法清除气流中的僵尸

如何对行使用分段/部分.diff()或.pct_change()?

从Python调用GMP C函数时的分段错误和内存泄漏

从单个列创建多个列并按pandas分组

自定义新元未更新参数

拆分pandas列并创建包含这些拆分值计数的新列

如何计算列表列行之间的公共元素

如何在msgraph.GraphServiceClient上进行身份验证?

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

用Python解密Java加密文件

在np数组上实现无重叠的二维滑动窗口

Pre—Commit MyPy无法禁用非错误消息

Stacked bar chart from billrame

合并与拼接并举

Numpyro AR(1)均值切换模型抽样不一致性