var MainWindowHandle:cardinal; Data: array [0..100] of byte; DataMSG:byte; private procedure ProcMSG(var VMsg:TMessage); message WM_USER+1; public function open(MainWinHandle:cardinal;pData:Pointer;MsgP:pointer):boolean; stdcall external 'gtr.dll'; // инициализация в начале работы приложения initDLL(MainWinHandle, Addr(Data), Addr(DataMSG)); procedure TForm1.ProcMSG(var VMsg:TMessage); begin case DataMSG of 04: begin // работа массивом Data end; end;
Мой код такой
from PyQt4.QtCore import * from PyQt4.QtGui import * from ui import Ui_mainForm from ctypes import * class mainForm(QWidget): def __init__(self, parent=None): super(mainForm, self).__init__(parent) self.ui = Ui_mainForm() self.ui.setupUi(self) MainWindowHandle = windll.kernel32.GetCurrentThread() #MainWindowHandle = self.winId() gtrDLL = windll.LoadLibrary('gtr.dll') gtrDLL.open.restype = c_bool HEAP_ZERO_MEMORY = 8L GetProcessHeap = windll.kernel32.GetProcessHeap HeapAlloc = windll.kernel32.HeapAlloc HeapFree = windll.kernel32.HeapFree self.buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100 * sizeof(c_byte)) self.DataMSG = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(c_byte)) # освобождать память буду в конце работы приложения gtrDLL.open(c_ulong(MainWindowHandle), self.buffer, self.DataMSG) def winEvent(self, message): WM_USER = 0x0400 if message.message == WM_USER + 1: # это условие не выполняется никогда #if self.DataMSG == 2: #if (c_byte).from_address(self.DataMSG) == c_byte(2): result = (c_byte * 100).from_address(buffer) print result return (False, 0) # подсмотрел в чудом коде, но не уверен, что нужно именно так делать #return QWidget.winEvent(False, message.message)