Попытка доступа к функциям в Virtual Print Engine dll с использованием Python 3 ctypes в Windows - PullRequest
0 голосов
/ 21 мая 2018

Я довольно новичок в программировании на Python и ищу помощи в использовании Python 3 для взаимодействия с Virtual Print Engine Ideal Software * в Windows 7, 8 и 10.

I 'Мы искали решение повсюду и безуспешно связывались с автором DLL.Он не использует Python, и его пример Python не работает.

Цель

Я хочу преобразовать в простой пример C Python 3 Ideal Software из Руководства их программиста следующим образом ...

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 ---- заголовок окна предварительного просмотра.Этот заголовок также используется VPE для создания имени задания по умолчанию для задания на печать.

длинные флаги ---- контролирует стиль предварительного просмотра и поведение VPE (см. Ниже)

Возвращает: дескриптор (= идентификатор) виртуального документа.Этот дескриптор должен быть предоставлен для всех других вызовов VPE.В случае ошибки возвращается NULL (0).На 32-разрядных платформах дескриптор представляет собой 32-разрядное целое число, на 64-разрядных платформах это 64-разрядное целое число.

Проблемы

Я могу загрузитьDLL, но я не могу понять, как получить ...

  1. родительский дескриптор вызова / идентификатор, на который ссылается их пример в первой строке

    e.g. void MakeDoc(HWND hWndParent).
    

    НеБольшая проблема в данный момент, так как я вызываю свой скрипт на Python с другого языка в пакетном режиме.Но я хочу, чтобы вокруг него была оболочка Python.

  2. 32-битный возвращаемый дескриптор из функции DLL, VpeOpenDoc в примере кода,

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

    для доступа к другим функциям в DLL.

Мой код 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

Буду признателен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...