Чому втрачається значення змінна
Здрастуйте.У мене виникло питання наступного плану: Є 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; іf state then SysHook := SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProcdbclik, HInstance, 0); else UnhookWindowsHookEx(SysHook); SysHook := 0; end;
exports RunStopHook index 1; end. так ось проблема вся в тому, що ці 2 функції не можуть обмінюватися параметрами тобто в RunStopHook параметр X передається нормально і зберігається в XX а для SysMsgProcdbclikXXдорівнює 0 чому це відбувається і як можна це виправити?
А де в SysMsgProcdbclik цей XX? І хто Вас надоумив використовувати гол. змінні в DLL?
І хто Вас надоумив використовувати гол. змінні в DLL?Хм. а чому б, власне, і не використовувати. Ось, наприклад, я зберігаю хендл ком-порта. Ну не відкривати ж його щоразу в будь-якій процедурі.
>> оскільки SysMsgProcdbclik не доаускает зміни в объявлении У якому сенсі?
У dll DElphi немає глобальних змінних: для кожного процесу вони свої. Найближчий вихід – використовувати memory mapping. http://www.delphimaster.ru/articles/hooks/index.html
Романе, ти – телепат? Невже мова справді йде про обмін між процесами? З питання це не випливає. Чи це я такий тупий.
Ось код 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 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; //============================================ ============ procedureCloseGlobalData(); 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. Помилка відбувається навіть якщо нічого не робити, помилку викликають усі додатки які можуть бути в пам'яті
Зокрема відбувається навіть якщо у якогось вікна натиснути на кнопку [x] або при запуску проги TheBat, Операційна XP
Пробував як динамічний, так і статичний виклик ДЛЛ
Помилка відбувається не в моїй програмі, а моя програма викликає помилку в інших додатках і, судячи з усього, винен тому memory mapping. подивіться будь ласкащо не таку моєму коді
Може бути, ТИ таки наслідуєш мою пораду? Це ж саме ТЕБІ треба. А? А чи тобі не треба?
так я ставив скрізь beep пікають нормально без збоїв.
От і дивно, значить збоїв більше немає! Що і потрібно.
Ё-моє для тих хто в танку: Збоїть не моя прога, а моя прога змушує збоїти інші проги що не роблю то експлорер то . викликають помилку. :(