Чому втрачається значення змінна

Здрастуйте.У мене виникло питання наступного плану: Є 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 пікають нормально без збоїв.

От і дивно, значить збоїв більше немає! Що і потрібно.

Ё-моє для тих хто в танку: Збоїть не моя прога, а моя прога змушує збоїти інші проги що не роблю то експлорер то . викликають помилку. :(