Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1097061914
Russel
2004-10-06 15:25
2004.10.24
Установка старого компонента


3-1096361272
Fishka
2004-09-28 12:47
2004.10.24
DBRichEdit и ADODataSet - ??? управляющие символы в таблице


3-1095744487
Fishka
2004-09-21 09:28
2004.10.24
Level DBF-файлов 5 и 7 - какое это имеет значение?


14-1096729927
kaZaNoVa
2004-10-02 19:12
2004.10.24
Обработка видео


1-1097013841
001
2004-10-06 02:04
2004.10.24
Дочернее окно содержит TDBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский