Variável em DLL
Pessoal,
para monitorar o menu de um determinado aplicativo eu criei uma DLL para instalção do gancho(hook).
Ocorre que a variável declarada para armazenar o handle da janela sendo monitorada, após sua atribuição, perde o valor mantendo aquele que foi atribuído em sua inicialização.
Este é parte do código:
Ocorre que o MessageBox em InstallWndHook mostra a mensagem com o valor da variável igual ao atribuido a ela (handle da janela). Entretanto, o MessageBox em SysMsgProc mostra o valor correspondente ao de sua inicialização (1).
Alguém saberia me ajudar ou explicar o que está ocorrendo?
obs:
- Ocorre com hook em outros eventos: WH_COMMAND ou WH_SYSCOMMAND;
- Já tentei adicionando ShareMem;
Grato pela atenção.
para monitorar o menu de um determinado aplicativo eu criei uma DLL para instalção do gancho(hook).
Ocorre que a variável declarada para armazenar o handle da janela sendo monitorada, após sua atribuição, perde o valor mantendo aquele que foi atribuído em sua inicialização.
Este é parte do código:
const MENU_ITEM_ID = $999; type PMSG = ^TMSG; var WndProg :HWND = 1; // *** Esta é a variável WndOwner :HWND; HWndHook :HHook; Buffer :array[0..128] of char; function SysMsgProc(Code: Integer; wParam: Word; lParam: Longint): LongInt; stdcall; var PWndMSG :PMSG; begin if Code = MSGF_MENU then // outro processo que não o atual begin PWndMSG := PMSG(lParam); MessageBox(0, PChar(Format(´Testando hook: hWnd ¬d, Wnd ¬d´, [PWndMSG^.hWnd, WndProg])), ´Teste´, MB_OK); if PWndMSG^.hWnd = WndProg then begin if (PWndMSG^.message = WM_MENUSELECT) then begin if LOWORD(PWndMSG^.wParam) = MENU_ITEM_ID then begin MessageBox(0, ´Meu item acionado´, ´Teste´, MB_OK); Exit; end else MessageBox(0, ´Outro item acionado´, ´Teste´, MB_OK); end; end; end; Result := CallNextHookEx(HWndHook, code, wParam, lParam); // Passa evento para outros ganchos end; function InstallWndHook(var aWndOwner, aWnd :HWND): LongInt; stdcall; begin WndOwner := aWndOwner; WndProg := aWnd; MessageBox(0, PChar(Format(´Testando hook: Wnd ¬d´, [WndProg])), ´Teste´, MB_OK); HWndHook := SetWindowsHookEx(WH_SYSMSGFILTER, @SysMsgProc, hInstance, 0); if HWndHook = 0 then Result := GetLastError else Result := 0; end;
Ocorre que o MessageBox em InstallWndHook mostra a mensagem com o valor da variável igual ao atribuido a ela (handle da janela). Entretanto, o MessageBox em SysMsgProc mostra o valor correspondente ao de sua inicialização (1).
Alguém saberia me ajudar ou explicar o que está ocorrendo?
obs:
- Ocorre com hook em outros eventos: WH_COMMAND ou WH_SYSCOMMAND;
- Já tentei adicionando ShareMem;
Grato pela atenção.
Micheus
Curtidas 0
Respostas
Raczy
15/12/2006
Deve ser algum problema com gerenciamento de memória, acho que essa variável não pode ser declarada como global. Isso também acontecia comigo quando eu usava uma dll com um ponteiro, na primeira vez funcionava, depois ele perdia o valor.
GOSTEI 0
Micheus
15/12/2006
É que na primeira vez é carregada na instância do seu programa. Depois, para cada aplicação, a DLL é carregada naquela instância. Então não dá para trabalhar desta forma.
Depois que descobri um tal de FileMapping, fiz uma busca e fui justamente cair num artigo aqui do forum que explica como compartilhar a informação da DLL com minha aplicação - [url=http://forum.devmedia.com.br/viewtopic.php?t=78248&sid=3e1d3e52295ef8fbb873131b598bb6a0]Usando Hook Procedure p/ capturar teclas digitadas no window[/url]
Obrigado.
Depois que descobri um tal de FileMapping, fiz uma busca e fui justamente cair num artigo aqui do forum que explica como compartilhar a informação da DLL com minha aplicação - [url=http://forum.devmedia.com.br/viewtopic.php?t=78248&sid=3e1d3e52295ef8fbb873131b598bb6a0]Usando Hook Procedure p/ capturar teclas digitadas no window[/url]
Obrigado.
GOSTEI 0