Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Почему теряется значение переменная?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.037 c
14-1096669667
GanibalLector
2004-10-02 02:27
2004.10.24
СУПЕРМАРКЕТ...


14-1096917021
Piter
2004-10-04 23:10
2004.10.24
Кто-нибудь сможет сходу определить причину ошибки? :)


1-1097061914
Russel
2004-10-06 15:25
2004.10.24
Установка старого компонента


1-1096554966
Devel
2004-09-30 18:36
2004.10.24
AV при использовании TXMLDocument


8-1085750766
Bruno
2004-05-28 17:26
2004.10.24
Как вырезать из AVI отдельные кадры в bmp, jpeg....