Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
ВнизПочему теряется значение переменная? Найти похожие ветки
← →
TeNY © (2004-10-06 19:58) [0]Здраствуйте.У меня возник вопрос следующего плана:
Имеется Dll следующего содержания
library bufer;
uses Windows,Messages;
var
SysHook : HHook = 0;
Wnd : Hwnd = 0;
xx:HWND;
function SysMsgProcdbclik(code : integer; wParam : word;lParamt : longint) : longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParamt);Wnd := TMsg(Pointer(lParamt)^).hwnd;
end;
procedure RunStopHook(State:Boolean;x:HWND) export; stdcall;
begin
xx:=x;
if state then
SysHook := SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProcdbclik, HInstance, 0);
else
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;
exports RunStopHook index 1;
end.
так вот проблема вся в том что эти 2 функции не могут обмениватся параметрами
то есть в RunStopHook параметр X передается нормально и сохраняется в XX а
для SysMsgProcdbclik XX равен 0,почему это происходит и как можно это исправить?
← →
Fay © (2004-10-06 20:06) [1]А где в SysMsgProcdbclik этот XX ?
И кто Вас надоумил использовать гл. переменные в DLL?
← →
GanibalLector © (2004-10-06 20:29) [2]И кто Вас надоумил использовать гл. переменные в DLL?
Хм...а почему бы собственно и не использовать???
Вот,например,я храню хэндл ком-порта.Ну не открывать же его каждый раз в любой процедуре.
← →
TeNY © (2004-10-06 20:34) [3]SysMsgProcdbclik это функция типа TFNHOOKproc используется как хук
> Fay © (06.10.04 20:06) [1]
> А где в SysMsgProcdbclik этот XX ?
ХХ в разделе вар так как SysMsgProcdbclik не доаускает изменения в обьявлении
> И кто Вас надоумил использовать гл. переменные в DLL?
А как вы хотите иначе передавать параметры,может знаете другие пути? подскажите?
← →
Fay © (2004-10-06 20:36) [4]2 GanibalLector ©
А с двумя портами?
← →
Fay © (2004-10-06 20:37) [5]2 TeNY ©
Передайте указатель.
← →
Fay © (2004-10-06 20:38) [6]>> так как SysMsgProcdbclik не доаускает изменения в обьявлении
В каком смысле?
← →
Romkin © (2004-10-06 20:46) [7]В dll DElphi нет глобальных переменных: для каждого процесса они свои. Ближайший выход - использовать memory mapping....
http://www.delphimaster.ru/articles/hooks/index.html
← →
Fay © (2004-10-06 20:49) [8]Роман, ты - телепат? Неужели речь действительно идёт об обмене между процессами?! Из вопроса это не следует. Или это я такой тупой.
← →
Romkin © (2004-10-06 20:50) [9]Fay © (06.10.04 20:49) [8] Телепаем помаленьку... Я просто уже/еще почти не соображаю, так что только это и остается :)
← →
TeNY © (2004-10-07 06:02) [10]
> Romkin © (06.10.04 20:46) [7]
> В dll DElphi нет глобальных переменных:
Ну ты это загнул вообще-то они везде есть,по крайней мере такой способ у меня всегда работал до тех пор пока не связался с хуками
> Romkin © (06.10.04 20:46) [7]
> http://www.delphimaster.ru/articles/hooks/index.html
Спасибо...
← →
TeNY © (2004-10-07 11:39) [11]Импользовал тексты предложенные автором при установки хука при попытки обратится к какому- нибудь окну постоянно выдаюстя сообщения
Инструкция по адресу 0хFF6400127 обратилась к памяти по адресу 0хFF6400127.Память не может быть Read
и далее
Runtime Error 216 FF640127
В чем дело?
← →
Lin7 (2004-10-07 11:46) [12]
> TeNY © (07.10.04 11:39) [11]
У меня с этими примерами проблем не было. Код в студию.
← →
TeNY © (2004-10-07 18:25) [13]Вот код
library bufer;
uses Windows,Messages;
const
MMFName: PChar = "KeyMMF";
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // дескриптор установленной ловушки
MyAppWnd: HWND; // дескриптор нашего приложения
Wnd:Hwnd;// дескриптор приложения исключения
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
//=======================================================
procedure HacK; stdcall;begin
SendMessage(GlobalData^.Wnd, EM_SETPASSWORDCHAR, 0,0);
InvalidateRect(GlobalData^.Wnd, nil, true);
Beep(500,100);
end;
//=======================================================
function HOOK(code : integer; wParam : word;lParamt : longint) : longint; stdcall;
begin
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParamt);
Exit;
end
else
if TMsg(Pointer(lParamt)^).message =WM_RBUTTONDOWN then
begin
GlobalData^.Wnd := GetForegroundWindow();
if GlobalData^.MyAppWnd<>GlobalData^.Wnd
then
begin
HacK;
end;
end;
CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParamt);
end;
//=======================================================
procedure RunStopHook(State,DBilck,Unlock: Boolean;x:HWND) export; stdcall;
begin
GlobalData^.MyAppWnd:=X;
if State then
begin
Beep(5000,100);
GlobalData^.SysHook := SetWindowsHookEx(WH_GETMESSAGE,@hook, HInstance, 0)
end
else
UnhookWindowsHookEx(GlobalData^.SysHook);
sleep(1000);
end;
procedure OpenGlobalData();
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
begin
MessageBox(0, "Can""t create FileMapping", "Message from keyhook.dll", 0);
Exit;
end;
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
MessageBox(0, "Can""t make MapViewOfFile", "Message from keyhook.dll", 0);
Exit;
end;
end;
//=======================================================
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
//=======================================================
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports RunStopHook index 1;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Ошибка происходит даже если ничего не делать,ошибку вызывают все приложения которые могут быть в памяти
← →
TeNY © (2004-10-07 18:31) [14]В частности происходит даже если у какого- нибудь окна нажать на кнопку [x] или при запуске проги TheBat,Операционка XP
← →
TeNY © (2004-10-07 19:01) [15]Пробовал как динамический так и статичкий вызов ДЛЛ
← →
Cobalt © (2004-10-07 22:43) [16]Отлаживай - например, ставь Beep после определённой операции :)
Постепенно найдёшь, где валится.
Как найдёшь место - подумай, что там такого может быть.
← →
TeNY © (2004-10-08 06:33) [17]Ошибка происходит не в моей программе,а моя программа вызывает ошибку в других приложениях и судя по всему виной тому memory mapping.... посмотрите пожалуйста что не так в моём коде
← →
Cobalt © (2004-10-08 18:54) [18]Может быть, ТЫ таки последуешь моему совету?
Это ведь именно ТЕБЕ надо.
А?
Или тебе не надо?
← →
TeNY © (2004-10-09 07:03) [19]да ставил я ствил везде beep пикают нормально без збоев...
← →
Cobalt © (2004-10-09 13:27) [20]Вот и чудненько, значит сбоев больше нет!
Что и требовалось.
← →
TeNY © (2004-10-10 17:25) [21]Ё-моё для тех кто в танке:
Сбоит не моя прога,а моя прога заставляет сбоить другие проги что не делаю то експлорер то ... вызавыют ошибку... :(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.034 c