我是Python编程的新手,我正在寻求帮助使用Python 3在Windows 7,8和10上与Ideal Software's Virtual Print Engine DLL接口。
我到处寻找解决方案,并毫不费力地联系了DLL的作者。他不使用Python而他的Python example不起作用。
我想从他们的程序员手册中转换为Python 3 Ideal Software的简单C示例,如下所示......
void MakeDoc(HWND hWndParent)
{
// hWndParent is the window handle of your application window
VpeHandle hDoc = VpeOpenDoc(hWndParent, "Test", 0);
VpeWriteBox(hDoc, 1, 1, 5, 1.5, "Hello World!");
VpeLine(hDoc, 1.5, 3, 5, 6.5);
VpeWriteDoc(hDoc, "hello world.pdf");
VpePreviewDoc(hDoc, NULL, VPE_SHOW_NORMAL);
}
您可以根据需要同时打开任意数量的文档。这些文档由唯一句柄(VpeHandle,在32位平台上为32位整数,在64位平台上为64位整数)标识,其值与NULL不同,后者由VpeOpenDoc()返回。在连续调用输出函数时使用此句柄。
每个文档都可能发送消息。窗口接收消息,在VpeOpenDoc()的第一个参数中指定为父窗口。
从DLL参考指南中,VpeOpenDoc函数被描述为......
3.2 VpeOpenDoc
创建一个包含一个初始空白页的新文档。
VpeHandle VpeOpenDoc(HWND hwndParent,LPCSTR标题,长旗)
HWND hwndParent ----您的调用应用程序窗口,它将成为VPE预览窗口的父窗口。 VPE与它交换消息。如果嵌入了预览,则它也将是预览的主窗口。 此参数可以为NULL,例如在无窗口应用程序(如服务器进程或批处理作业)中使用VPE。在这种情况下,您可以安装消息回调函数,以便接收VPE生成的事件。有关详细信息,请参阅VpeSetMsgCallback()。 对于非Windows平台,此参数必须为NULL。
LPCSTR title ----预览窗口的标题。 VPE还使用该标题来组成打印作业的默认JobName。
long flags ----控制预览的样式和VPE的行为(见下文)
返回: 虚拟文档的句柄(=标识符)。必须将此句柄提供给所有其他人 VPE电话。如果发生错误,则返回NULL(0)。 在32位平台上,句柄是32位整数,在64位平台上,它是64位整数。
我可以加载DLL,但我无法弄清楚如何获取...
父调用句柄/ id,其示例在第一行引用
e.g. void MakeDoc(HWND hWndParent).
目前不是一个大问题,因为我在批处理模式下从另一种语言调用我的Python脚本。但是我希望稍后有一个Python包装器。
来自DLL函数的32位返回句柄,示例代码中的VpeOpenDoc,
VpeHandle hDoc = VpeOpenDoc(hWndParent, "Test", 0)
用于访问DLL中的其他函数。
from ctypes import*
VPEdll = windll.LoadLibrary("M:\\python\\vpec3271.dll")
print("VPEdll=", VPEdll)
VPEdll_handle = VPEdll._handle
print("VPEdll_handle=", VPEdll_handle)
VPEdoc = VPEdll.VpeOpenDoc(None,"VPE_Test", 0)
print("VPEdoc=", VPEdoc)
VPEdll.VpePrint(byref(VPEdoc), 5, 1, "Hello World!")
VPEdll.VpeWriteDoc(byref(VPEdoc), "M:\\python\\My Document.pdf")
VPEdll.VpeCloseDoc(byref(VPEdoc))
m:\Python\Python35-32>python vpe_test.py
VPEdll= <WinDLL 'M:\python\vpec3271.dll', handle 62570000 at 0x23bff0>
VPEdll_handle= 1649868800
VPEdoc= 45918424
Traceback (most recent call last):
File "vpe_test.py", line 9, in <module>
VPEdll.VpePrint(byref(VPEdoc), 5, 1, "Hello World!")
TypeError: byref() argument must be a ctypes instance, not 'int'
因此,在将第7行更改为c_int
后,我收到了下一个错误VPEdoc = c_int(VPEdll.VpeOpenDoc(无,“VPE_Test”,0))
m:\Python\Python35-32>python vpe_test.py
VPEdll= <WinDLL 'M:\python\vpec3271.dll', handle 62570000 at 0x235b30>
VPEdll_handle= 1649868800
VPEdoc= c_long(44345560)
Traceback (most recent call last):
File "vpe_test.py", line 9, in <module>
VPEdll.VpePrint(byref(VPEdoc), 5, 1, "Hello World!")
OSError: exception: access violation reading 0x00000010
我很感激你的帮助。