العثور على الطرف الثالث Qwidget مع رمز حقن و Qwidget :: Find (HWND)
-
19-09-2019 - |
سؤال
لدي QT DLL الذي حقنه في تطبيق تابع لجهة خارجية باستخدام مكتبة Detours Windows:
if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
&si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
"C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))
ثم قمت بتعيين خطاف على مستوى النظام ليعترض إنشاء نافذة:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
حيث XOR هو اسم برامجي، والحالة :: GetInstance () هو Singleton حيث أظل Globals.
في اتصال CBTProc الخاص بي، أريد اعتراض جميع النوافذ التي هي qwidgets:
HWND hwnd= FindWindow(L"QWidget", NULL);
الذي يعمل بشكل جيد، لأنني أحصل على HWND المقابلة (راجعت مع التجسس ++)، فأنا أريد الحصول على مؤشر إلى Qwidget، لذلك يمكنني استخدام وظائفها:
QWidget* q = QWidget::find(hwnd);
ولكن هذه هي المشكلة، المؤشر المرتجع هو دائما 0. أنا لست حقن الشفهري في العملية بشكل صحيح؟ أو أنا لا أستخدم Qwidget :: Find () كما يجب علي؟
شكرًا،
ديف
عدل
المحلول
أجاب:
خطأ غبي، كنت أرجو في تصحيح، لذلك كان Qtgui4d.dll و Qtcore4d.dll أنه حيث التحميل، وليس Qtcore4.dll و Qtgui.dll
نصائح أخرى
قارن عن عناوين `qwidgetprivate :: mapper في DLL وفي التعليمات البرمجية الخاصة بك. esp. إذا تم ربط المرء بشكل شروي، فقد يكون هناك مثيلين منه، ولكل منهما، فكاه، مجموعة من الحاجيات.