Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2012 12:34:50

Nolr
От:
Зарегистрирован: 2011-03-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

DLL, messages, qt

Есть dll. Есть код на delphi, работающий с ней.

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)



Отредактировано Nolr (Авг. 22, 2012 13:27:25)

Офлайн

#2 Авг. 21, 2012 11:27:32

Nolr
От:
Зарегистрирован: 2011-03-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

DLL, messages, qt

Добавлю, что есть pyqt и с помощью (bool, int result) QWidget.winEvent (self, MSG message) можно добраться до нужного мне сообщения, а потом данным. Вопрос как получить result?

Идею подглядел в http://www.qtcentre.org/threads/42038-Problems-with-recieving-Windows-messages-using-winEvent



Отредактировано Nolr (Авг. 21, 2012 12:50:23)

Офлайн

#3 Авг. 22, 2012 13:23:43

Nolr
От:
Зарегистрирован: 2011-03-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

DLL, messages, qt

А вот с таким кодом у кого-то есть идеи как решить эту задачу?



Офлайн

#4 Авг. 22, 2012 18:31:58

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

DLL, messages, qt

Откуда должен прийти WM_USER + 1 ?

http://www.riverbankcomputing.com/pipermail/pyqt/2006-August/013891.html

The PyQt4 variant of this function returns a tuple where the first
element is the same as the result value of the Qt function and the
second item is the long* result.

Офлайн

#5 Авг. 23, 2012 14:37:31

Nolr
От:
Зарегистрирован: 2011-03-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

DLL, messages, qt

Откуда должен прийти WM_USER + 1 ?
Это сообщение от DLL.

С моим вопросом разобрался. Проблема была не в коде.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version