Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему теряется значение переменная?


Страницы:   1 2

TeNY ©   (2004-10-06 19:58:00) 

Здраствуйте.У меня возник вопрос следующего плана:
Имеется 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,почему это происходит и как можно это исправить?


TeNY   (2004-10-10 17:25:00) [1]

Ё-моё для тех кто в танке:
Сбоит не моя прога,а моя прога заставляет сбоить другие проги что не делаю то експлорер то ... вызавыют ошибку... :(


Cobalt   (2004-10-09 13:27:00) [2]

Вот и чудненько, значит сбоев больше нет!
Что и требовалось.


TeNY   (2004-10-09 07:03:00) [3]

да ставил я ствил везде beep пикают нормально без збоев...


Cobalt   (2004-10-08 18:54:00) [4]

Может быть, ТЫ таки последуешь моему совету?
Это ведь именно ТЕБЕ надо.
А?
Или тебе не надо?


TeNY   (2004-10-08 06:33:00) [5]

Ошибка происходит не в моей программе,а моя программа вызывает ошибку в других приложениях и судя по всему виной тому memory mapping.... посмотрите пожалуйста что не такв моём коде


Cobalt   (2004-10-07 22:43:00) [6]

Отлаживай - например, ставь Beep после определённой операции :)
Постепенно найдёшь, где валится.
Как найдёшь место - подумай, что там такого может быть.


TeNY   (2004-10-07 19:01:00) [7]

Пробовал как динамический так и статичкий вызов ДЛЛ


TeNY   (2004-10-07 18:31:00) [8]

В частности происходит даже если у какого- нибудь окна нажать на кнопку [x] или при запуске проги TheBat,Операционка XP


TeNY   (2004-10-07 18:25:00) [9]

Вот код
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.

Ошибка происходит даже если ничего не делать,ошибку вызывают все приложения которые могут быть в памяти


Lin7   (2004-10-07 11:46:00) [10]


> TeNY ©   (07.10.04 11:39) [11]

У меня с этими примерами проблем не было. Код в студию.


TeNY   (2004-10-07 11:39:00) [11]

Импользовал тексты предложенные автором при установки хука  при попытки обратится к какому- нибудь окну постоянно выдаюстя сообщения
Инструкция по адресу 0хFF6400127 обратилась к памяти по адресу 0хFF6400127.Память не может быть Read
и далее
Runtime Error 216 FF640127
В чем дело?


TeNY   (2004-10-07 06:02:00) [12]


> Romkin ©   (06.10.04 20:46) [7]
> В dll  DElphi нет глобальных переменных:

Ну ты это загнул вообще-то они везде есть,по крайней мере такой способ у меня всегда работал до тех пор пока не связался с хуками

> Romkin ©   (06.10.04 20:46) [7]
> http://www.delphimaster.ru/articles/hooks/index.html

Спасибо...


Romkin   (2004-10-06 20:50:00) [13]

Fay ©  (06.10.04 20:49) [8] Телепаем помаленьку... Я просто уже/еще почти не соображаю, так что только это и остается :)


Fay   (2004-10-06 20:49:00) [14]

Роман, ты - телепат? Неужели речь действительно идёт об обмене между процессами?! Из вопроса это не следует. Или это я такой тупой.


Romkin   (2004-10-06 20:46:00) [15]

В dll  DElphi нет глобальных переменных: для каждого процесса они свои. Ближайший выход - использовать memory mapping....
http://www.delphimaster.ru/articles/hooks/index.html


Fay   (2004-10-06 20:38:00) [16]

>> так как SysMsgProcdbclik не доаускает изменения в обьявлении
В каком смысле?


Fay   (2004-10-06 20:37:00) [17]

2 TeNY ©
Передайте указатель.


Fay   (2004-10-06 20:36:00) [18]

2 GanibalLector ©
А с двумя портами?


TeNY   (2004-10-06 20:34:00) [19]

SysMsgProcdbclik это функция типа TFNHOOKproc используется как хук

> Fay ©   (06.10.04 20:06) [1]
> А где в SysMsgProcdbclik этот XX ?
ХХ в разделе вар так как SysMsgProcdbclik не доаускает изменения в обьявлении
> И кто Вас надоумил использовать гл. переменные в DLL?

А как вы хотите иначе передавать параметры,может знаете другие пути? подскажите?


GanibalLector   (2004-10-06 20:29:00) [20]

И кто Вас надоумил использовать гл. переменные в DLL?
Хм...а почему бы собственно и не использовать???
Вот,например,я храню хэндл ком-порта.Ну не открывать же его каждый раз в любой процедуре.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо