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

Тема в разделе "Общие вопросы по С и С++", создана пользователем solova, 14 апр 2011.

  1. solova

    solova Гость

    Устанавливаю хук "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, чтоб в место МессаджБокса СендМессадж послать
     
  2. a0z

    a0z Well-Known Member

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

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


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

    solova Гость

    всё работает
    сделал так<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")
    я вставил в срр файл, так надо да?
     
  4. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Да, так.
     
Загрузка...
Похожие Темы - Потерялась переменная
  1. IvanFuture
    Ответов:
    0
    Просмотров:
    1.163
  2. slavon-x86
    Ответов:
    10
    Просмотров:
    4.849
  3. slavon-x86
    Ответов:
    2
    Просмотров:
    2.801
  4. slavon-x86
    Ответов:
    3
    Просмотров:
    2.305

Поделиться этой страницей