פורסם 2007 בנובמבר 2618 שנים שלום לכולם כתבתי dll פשוט שמטרתו לשלוח הודעה לחלון שקרא לו בכל פעם שנוצר חלון חדש במערכת בעזרת קביעת hook. זה הקוד של ה cpp של ה dll: #include "stdafx.h"#include "HookManager.h"#ifdef _MANAGED#pragma managed(push, off)#endif#pragma data_seg(".SHARED")HWND hCallerWnd = NULL;#pragma data_seg()#pragma comment("linker, /section:.SHARED,rws")HINSTANCE hInstance;HHOOK hkShellHook;UINT KBWM_WINDOWCREATED;BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: KBWM_WINDOWCREATED = RegisterWindowMessage(KBWM_WINDOWCREATED_MSG); hInstance = (HINSTANCE) hModule; break; case DLL_PROCESS_DETACH: UnhookWindowsHookEx(hkShellHook); break; } return TRUE;}LRESULT CALLBACK ShellProc(UINT nCode, WPARAM wParam, LPARAM lParam){ if(nCode == HSHELL_WINDOWCREATED) PostMessage(hCallerWnd, KBWM_WINDOWCREATED, wParam, 0); return CallNextHookEx(hkShellHook, nCode, wParam, lParam);}__declspec(dllexport) BOOL SetHook(HWND caller){ hCallerWnd = caller; hkShellHook = ::SetWindowsHookEx(WH_SHELL, (HOOKPROC) ShellProc, hInstance, 0); return (hkShellHook != NULL);}#ifdef _MANAGED#pragma managed(pop)#endif וה header של ה dll: #define KBWM_WINDOWCREATED_MSG _T("KBWM_WINDOWCREATED_MSG-{49E9712B-372A-4873-A1BE-84D40C56916E}")__declspec(dllexport) BOOL SetHook(HWND caller); כדי לבדוק אותו יצרתי פרוייקט mfc שאמור להראות רשימה של החלונות שנוצרים. אלה הקטעים הרלוונטיים מהקוד שלו: #include "..\HookManager\HookManager.h"...const UINT KBWM_WINDOWCREATED = ::RegisterWindowMessage(KBWM_WINDOWCREATED_MSG);...BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_REGISTERED_MESSAGE(KBWM_WINDOWCREATED, OnHookWindowCreated)END_MESSAGE_MAP()BOOL CTestDlg::OnInitDialog(){ ... SetHook(GetSafeHwnd()); ...}LRESULT CTestDlg::OnHookWindowCreated(WPARAM wParam, LPARAM lParam){ HWND hwnd = (HWND)wParam; TCHAR text[255]; ::GetWindowText(hwnd, text, 255); m_appsList.AddString(text); return TRUE;} הבעיה היא שאני מקבל הודעות רק עבור חלונות שנוצרים בתוכנה שלי ולא עבור כל המערכת, מה שאומר שמשום מה ה hook הגלובלי לא עובד. מישהו יודע למה זה קורה? תודה עריכה: הבעיה נפתרה. שברתי את הראש שעות בגלל גרשיים שלא היו במקום . השורה: #pragma comment("linker, /section:.SHARED,rws") צריכה להיות: #pragma comment(linker, "/section:.SHARED,rws") מה שגרם לכך שה hwnd של החלון שקרא ל dll לא שותף כמו שצריך בין המופעים השונים של ה dll והיה תקף רק ב process בו נמצא החלון.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.