Форум: "Начинающим";
Текущий архив: 2013.05.12;
Скачать: [xml.tar.bz2];
ВнизПередача значения из 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c