尝试使用Windows

时间:2018-05-21 06:39:21

标签: python python-3.x dll

我是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,但我无法弄清楚如何获取...

  1. 父调用句柄/ id,其示例在第一行引用

    e.g. void MakeDoc(HWND hWndParent).
    

    目前不是一个大问题,因为我在批处理模式下从另一种语言调用我的Python脚本。但是我希望稍后有一个Python包装器。

  2. 来自DLL函数的32位返回句柄,示例代码中的VpeOpenDoc,

     VpeHandle hDoc = VpeOpenDoc(hWndParent, "Test", 0) 
    

    用于访问DLL中的其他函数。

  3. 我的Python代码1

    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))
    

    Python错误1

     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))

      

    Python错误2

    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
    

    我很感激你的帮助。

0 个答案:

没有答案