![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача значения из 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 генерировать "событие"/послать сообщение в форму, или вызвать коллбек функцию, или сделать экспортируемые переменные которые в программе периодически проверять. грамотнее будет т что ближе по смыслу к тому что и как делается (насколько часто нужны значения, как долго обрабатываются, нужна ли потокозащищенность).