Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача значения из DLL в программу


ani ©   (2012-10-24 07:23:00) 

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

в 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) Как грамотнее отследить клик мыши по экрану и передать данные в форму? Клик мыши отслеживается не по форме, а вообще, где угодно. Важны только координаты и событие, левая\правая, нажал\отпустил.

Спасибо :)


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

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


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

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


Dimka Maslov   (2012-10-24 09:57:00) [3]

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

procedure GetPoint(out Point: TPoint); stdcall;


sniknik   (2012-10-24 09:34:00) [4]

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

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

++

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

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


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


> 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 08:11:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо