Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: SetWindowsHookEx Добавлено: 07.02.06 16:33  

Автор вопроса:  silently_fox | ICQ: 257821932 
При глобальном хуке(установленном в dll) для каждого приложения создаеться отдельный

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

переменные, как я понял на Си глобальные переменные с помощью диретив компилятора(pragma)

помещаются в именованный сегмент данных.

На PB такой директивы нет, как же тогда поступить

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 07.02.06 18:32
и для каждой из них будут свои глобальные переменные

С точностью до наоборот. Секция данных общая на все процессы, в которые подгружена dll. Именно поэтому и возможен хук.
Такая структура достигается определенными ключами линкера. В пб насколько я знаю, ключи оговаривать не получится.

как же тогда поступить
Использовать непб

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 07.02.06 20:16
На сколько я знаю SHARED секцию на нем не организовать, но что нам мепшает создать объект FileMapping и разделять его между разными процессами... Лишь бы имя было уникальным ;)

Ответить

Номер ответа: 3
Автор ответа:
 silently_fox



ICQ: 257821932 

Вопросов: 5
Ответов: 9
 Профиль | | #3 Добавлено: 07.02.06 21:16
Можно подробнее

Ответить

Номер ответа: 4
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #4 Добавлено: 11.02.06 17:53
Пример глобального хука на PBWIN c использованием SetWindowsHookEx

Тестовый EXE файл:

#Compile Exe
   #Dim All
   #Register None
   #Include "Win32Api.Inc"

   $UniqueName = "My Hook"

   Declare Function SetHook Lib "HookD.Dll" Alias "SetHook" (hWnd As Long) As Long

   CallBack Function DlgProc
      Local hHook As Long
      Static Id As Long
      Select Case CbMsg
         Case %WM_INITDIALOG: SetHook CbHndl
         Case %WM_USER + 1
            Incr Id
            SetWindowText GetDlgItem(CbHndl, 101), "KbdHook # " + Str$(id) + _
               " wParam = " + Hex$(CbWparam) + " LParam = " + Hex$(CbLparam) + " at " + Time$
         Case %WM_DESTROY   : hHook = GetProp(CbHndl, ByVal 1): If hHook Then UnhookWindowsHookEx hHook
      End Select
   End Function

   Function PbMain
      Local hDlg As Long
      ;Dialog New 0, $UniqueName, , , 300, 40, %WS_CAPTION Or %DS_MODALFRAME Or %WS_SYSMENU, %WS_EX_TOPMOST To hDlg
      Control Add Label, hDlg, 101, "", 10, 10, 280, 12
      ;Dialog Show Modal hDlg Call DlgProc
   End Function



Hook.dll


   #Compile Dll "HookD.Dll"
   #Register None
   #Dim All
   #Include "Win32Api.Inc"
   $UniqueName = "My Hook"

   Global hInstDLL As Long, MainDll As Long

   Function LibMain(ByVal hInstance As Long, ByVal fwdReason As Long, _
      ByVal lpvReserved As Long) Export As Long
      Select Case fwdReason
         Case %DLL_PROCESS_ATTACH: hInstDLL = hInstance: LibMain = 1
         Case %DLL_PROCESS_DETACH: LibMain = 1
      End Select
   End Function

   Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) Export As Long
      Static hHook As Long, hDlg As Long
      hDlg = FindWindow("", $UniqueName)
      If hHook = 0 Then If hDlg Then hHook = GetProp(hDlg, ByVal 1)
      If hHook Then Function = CallNextHookEx(ByVal hHook, ByVal nCode, ByVal wParam, ByVal lParam)
      If IsFalse(MainDll) And (IsFalse(hDlg) Or IsFalse(hHook)) Then FreeLibrary hInstDll Else _
         PostMessage hDlg, %WM_USER + 1, wParam, lParam
   End Function

   Function SetHook Alias "SetHook" (hWnd As Long) Export As Long
      Local hHook As Long
      hHook = SetWindowsHookEx (%WH_KEYBOARD, CodePtr(HookProc), ByVal hInstDLL, ByVal 0)
      SetProp hWnd, ByVal 1, ByVal hHook
      MainDll = 1
   End Function

Ответить

Номер ответа: 5
Автор ответа:
 silently_fox



ICQ: 257821932 

Вопросов: 5
Ответов: 9
 Профиль | | #5 Добавлено: 11.02.06 22:06
Спасибо

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам