Потерялась переменная

  • Автор темы solova
  • Дата начала
S

solova

#1
Устанавливаю хук "InstallHook(...., this->m_hWnd)" и передаю HWND окна запустившего его.
В Длл есть фунька InstallHook , так вот hPwnd и hProg имеют значение только в этой функции(проверено), а в КАЛБАК-е hPwnd = 0
как исправить?<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">.h</div></div><div class="sp-body"><div class="sp-content">
C++:
#ifdef HOOK_EXPORTS
#define HOOK_API __declspec(dllexport)
#else
#define HOOK_API __declspec(dllimport)
#endif
static HHOOK hHook = NULL;
static HANDLE hDll = NULL;	
static DWORD dwThread = NULL;	
static HWND hPwnd = NULL;				//!!!!!!!!!!!!!!!!!вот она переменная!!!!!!!!!
HOOK_API BOOL InstallHook(DWORD dwThrd,HWND hProg);
HOOK_API BOOL RemoveHook(void);	
LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam);
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">.cpp</div></div><div class="sp-body"><div class="sp-content">
C++:
#include "stdafx.h"
#include "hook.h"

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID /*lpReserved*/ )
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:hDll = hModule;
break;
case DLL_PROCESS_DETACH:MessageBox(0, L"PROCESS_DETACH", L"Target close" ,0);
break;
}
return TRUE;
}
HOOK_API BOOL RemoveHook(void){
UnhookWindowsHookEx(hHook);
return TRUE;}
//HWND hPwnd;				//!!!!!!!!!так тоже пробовал- не помогает!!!!!!!!!!!
HOOK_API BOOL InstallHook(DWORD dwThrd,HWND hProg){
hPwnd=hProg;
SendMessage(hPwnd,WM_USER+23,0,0);			//Месадж посылается , hPwnd != NULL
hHook = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,(HINSTANCE)hDll,dwThrd);
return TRUE;}

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode >= 0) //HC_ACTION
{
CWPSTRUCT *cwp=(CWPSTRUCT*)lParam;
if(cwp->message==WM_COMMAND)
SendMessage(hPwnd,WM_USER+23,0,0);		//Месадж не шлётся , hPwnd == NULL
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
как засветить эту переменную везде и будет ли она видна в DllMain, чтоб в место МессаджБокса СендМессадж послать
 

a0z

Well-known member
15.03.2011
108
0
#2
Так, если не ошибаюсь, InstallHook выполняется из одного процесса, а CallWndProc из другого?
Тогда ясно почему данные не сохраняются - в каждом процессе данные свои.
Можно попробовать shared section. В двух словах - объявляем секцию как-то типа
#pragma dataseg("ssect")
тут общие данные
#pragma dataseg end

в настройках проекта линкеру говорим, что секция ssect шареная.


Добавлено: Вот тут более подробно как объявить и что линкеру подсунуть
http://msdn.microsoft.com/en-us/library/h9...v=vs.80%29.aspx
 
S

solova

#3
всё работает
сделал так<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
C++:
#pragma data_seg("MySection")
HWND hPwnd=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:MySection,RWS")
я вставил в срр файл, так надо да?