Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.05.12;
Скачать: CL | DM;

Вниз

Передача значения из DLL в программу   Найти похожие ветки 

 
ani   (2012-10-24 07:23) [0]

Почему то не работает передача данных в форму из длл... Подскажите почему?(

в DLL :


library MouseH;

uses
 windows,
 messages,
 unit1;
...
...
...
msg := PMouseHookStruct(lParam);

 case wParam of
   WM_RBUTTONDOWN :
       begin
         unit1.Mpoint := msg^.pt;
         unit1.mk := "R_DOWN";
       end;

   WM_RBUTTONUP :
       begin
         unit1.Mpoint := msg^.pt;
         unit1.mk := "R_UP";
       end;

   WM_LBUTTONDOWN :
       begin
         unit1.Mpoint := msg^.pt;
         unit1.mk := "L_DOWN";
       end;

   WM_LBUTTONUP :
       begin
         unit1.Mpoint := msg^.pt;
         unit1.mk := "L_UP";
       end;

 end;


в программе:

var
 Mpoint:tpoint;
 mk: pchar;
...
...
Memo2.Lines.Strings[0] := inttostr(mpoint.X);
Memo2.Lines.Strings[1] := inttostr(mpoint.y);
Memo2.Lines.Strings[2] := mk;


1) Почему данные не передаются в программу из длл?  
2) Как грамотнее отследить клик мыши по экрану и передать данные в форму? Клик мыши отслеживается не по форме, а вообще, где угодно. Важны только координаты и событие, левая\правая, нажал\отпустил.

Спасибо :)


 
sniknik ©   (2012-10-24 08:11) [1]

1 unit1 прикомпиленный к программе и к dll это два разный юнита.
2 генерировать "событие"/послать сообщение в форму, или вызвать коллбек функцию, или сделать экспортируемые переменные которые в программе периодически проверять. грамотнее будет т что ближе по смыслу к тому что и как делается (насколько часто нужны значения, как долго обрабатываются, нужна ли потокозащищенность).


 
ani   (2012-10-24 09:23) [2]


> sniknik


Спасибо :) Только у меня не получается ни как все равно получить данные из длл, а именно координаты клика и событие:( Я уже и так и так пробовал..
Подскажите пожалуйста как сделать самый простой способ экспорта переменных из ДЛЛ? Ведь все переменные в длл являются локальными и для их получения я так понимаю надо вызывать внешнюю функцию которая должна обрабатываться в теле самой длл и возврашать данные? Так вот я так и делаю и ни чего не возвращается( Не знаю почему(

вот длл

library MouseH;

uses
 windows,
 messages,
 SysUtils;

var
 Mpoint: TPoint;
 MKey : pchar;
 theHook: THandle;

function MouseHook(nCode, wParam, lParam: integer): Lresult; stdcall;
var
 msg: PMouseHookStruct;
begin

 if nCode < 0 then
 begin
   result := CallNextHookEx(theHook, nCode, wParam, lParam);
   exit;
 end;

 msg := PMouseHookStruct(lParam);

 case wParam of
   WM_RBUTTONDOWN :
       begin
         Mpoint := msg^.pt;
         MKey := "R_DOWN";
       end;

   WM_RBUTTONUP :
       begin
         Mpoint := msg^.pt;
         MKey := "R_UP";
       end;

   WM_LBUTTONDOWN :
       begin
         Mpoint := msg^.pt;
         MKey := "L_DOWN";
       end;

   WM_LBUTTONUP :
       begin
         Mpoint := msg^.pt;
         MKey := "L_UP";
       end;

 end;

 result := CallNextHookEx(theHook, nCode, wParam, lParam);
end;

procedure Start; stdcall;
begin
 theHook := SetWindowsHookEx(wh_mouse, @mouseHook, hInstance, 0);
 if theHook = 0 then
   messageBox(0, "Error!", "Error!", mb_ok);
end;

procedure Remove; stdcall;
begin
 UnhookWindowsHookEx(theHook);
end;

function GetMKey : pchar; stdcall;
begin
result := MKey;
end;

function GetPoint : TPoint; stdcall;
begin
result := Mpoint;
end;

exports
 Start,
 Remove,
 GetMKey,
 GetPoint;

end.


а вот вызов из программы для теста:


function GetMKey : pchar; external "MouseH.dll";
function GetPoint : TPoint; external "MouseH.dll"
...
...
Form1.caption :=  pchar(GetMKey)+" "+ inttostr(GetPoint.x);


не работает :(


 
sniknik ©   (2012-10-24 09:34) [3]

> надо вызывать внешнюю функцию которая должна обрабатываться в теле самой длл и возврашать данные?
не надо, а можно, как один из вариантов. ИМХО, самый плохой.

> не работает :(
а ты ему зарплату платишь? видимо нет, раз просто "не работает"

++

dll
function GetPoint : TPoint; stdcall;
exe
function GetPoint : TPoint; external "MouseH.dll"

ничего не замечаешь? найди одно отличие...


 
Dimka Maslov ©   (2012-10-24 09:57) [4]

Функция, возвращающая запись (или указатель на интерфейс) это неявная процедура, в которую первым аргументом передаётся указатель. Чтобы небыло проблем с несовместимостью, надо так и писать:

procedure GetPoint(out Point: TPoint); stdcall;


 
ani   (2012-10-24 13:06) [5]

Больше спасибо! Все работает. Только один вопрос, почему функция отлавливается локально а не глобально? То есть вне формы она уже не работает.


 
ani   (2012-10-24 13:12) [6]

WH_MOUSE_LL все работает) спасибо всем за помошь!))



Страницы: 1 вся ветка

Текущий архив: 2013.05.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1357904865
NailMan
2013-01-11 15:47
2013.05.12
Сброс настроек панели задач в win7


2-1350541837
Александр_2012
2012-10-18 10:30
2013.05.12
Как убрать нули из DBEdit


15-1357849802
Юрий
2013-01-11 00:30
2013.05.12
С днем рождения ! 11 января 2013 пятница


15-1357798190
БарЛог
2013-01-10 10:09
2013.05.12
настройка php.ini


15-1357667504
RDen
2013-01-08 21:51
2013.05.12
Поздравляю с началом (официальным) работы в НГ!