Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2015, 07:08   #1
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию Размерность переменных функции SetWinEventHook в Windows 64bit

Доброе время суток
Подскажите какой размер занимают переменные в функциях WinApi SetWinEventHook, UnhookWinEvent в Windows 64bit.
Мне нужно их использовать в Excel VBA. Под 32 битной версией всё работает (там размерность всех типов 32bit), а под Excel 64bit зависает. Пока получилось определить следующее
Цитата:
HWINEVENTHOOK 64bit
LONG 32bit
BOOL 32bit
DWORD 32bit
UINT 32bit
HWND 64bit
А какую размерность имеют
Цитата:
HMODULE
WINEVENTPROC
Объявления функций на MSDN
Код:
HWINEVENTHOOK WINAPI SetWinEventHook(
  _In_ UINT         eventMin,
  _In_ UINT         eventMax,
  _In_ HMODULE      hmodWinEventProc,
  _In_ WINEVENTPROC lpfnWinEventProc,
  _In_ DWORD        idProcess,
  _In_ DWORD        idThread,
  _In_ UINT         dwflags
);

BOOL WINAPI UnhookWinEvent(
  _In_ HWINEVENTHOOK hWinEventHook
);

void CALLBACK WinEventProc(
   HWINEVENTHOOK hWinEventHook,
   DWORD         event,
   HWND          hwnd,
   LONG          idObject,
   LONG          idChild,
   DWORD         dwEventThread,
   DWORD         dwmsEventTime
);
Может ли быть проблема с передачей функции обратного вызова Excel для SetWinEventHook через AddressOf MyWinEventFunc?
AndVGri вне форума Ответить с цитированием
Старый 08.11.2015, 07:34   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
А какую размерность имеют
Оба указатели, а значит 64бита
p51x вне форума Ответить с цитированием
Старый 08.11.2015, 09:43   #3
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

p51x, большое спасибо. Завтра попробую протестировать. К сожалению, изменений не вижу Единственно, callback-функцию объявил как возвращающую тип Long, а не viod - как должно быть, но в Excel 2010 32bit это работало.
Не могли бы вы посмотреть, может я всё же где то ошибаюсь в определениях?
Код:
Private Const EVENT_SYSTEM_FOREGROUND = &H3&
Private Const WINEVENT_OUTOFCONTEXT = 0
 
Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As LongPtr, lpdwProcessId As Long) As Long
Private Declare PtrSafe Function UnhookWinEvent Lib "user32" (ByVal hWinEventHook As LongPtr) As Long

Private Declare PtrSafe Function SetWinEventHook Lib "user32.dll" ( _
    ByVal eventMin As Long, ByVal eventMax As Long, _
    ByVal hmodWinEventProc As LongPtr, ByVal pfnWinEventProc As LongPtr, _
    ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As LongPtr

Private ThisHookHandle As LongPtr

Public Sub StartHookForeground()
    Dim AppProcessId As Long, AppThreadId As Long
    AppProcessId = GetCurrentProcessId
    AppThreadId = GetWindowThreadProcessId(Application.Hwnd, AppProcessId)
    ThisHookHandle = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0, _
                     AddressOf WinEventFunc, AppProcessId, AppThreadId, WINEVENT_OUTOFCONTEXT)
End Sub

Public Sub StopHookForeground()
    If ThisHookHandle <> 0 Then UnhookWinEvent ThisHookHandle
End Sub
Private Sub WinEventFunc(ByVal HookHandle As LongPtr, ByVal LEvent As Long, _
                            ByVal Hwnd As LongPtr, ByVal idObject As Long, ByVal idChild As Long, _
                            ByVal idEventThread As Long, ByVal dwmsEventTime As Long)
End Sub
LongPtr - в 32 битных Excel - это 32 битное целое, а в 64битных 64 бита. Long - 32 битный.
Спасибо
AndVGri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли задать глобальную переменную из функции или как-то напрямую использовать память для хранения переменных из функции? Suny-o Общие вопросы Delphi 2 14.06.2012 11:45
функции двух переменных cote Помощь студентам 1 04.05.2012 20:46
Windows 7 64bit не дружит с компортом. WorldMaster C# (си шарп) 8 17.09.2011 11:01
Неработает код для перехвата API-функции в Vista 64bit artemvyrtosu Win Api 0 30.06.2009 18:31