문제

Windows Detours Library를 사용하여 타사 응용 프로그램에 주입하는 QT DLL Wich가 있습니다.

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 ()는 글로벌을 유지하는 싱글 톤입니다.

CBTPROC 콜백에서 QWIDGET 인 모든 Windows를 가로 채고 싶습니다.

HWND hwnd= FindWindow(L"QWidget", NULL);

해당 HWND (Spy ++로 확인)를 받기 때문에 잘 작동합니다. 그런 다음 QWIDGET에 대한 포인터를 얻고 싶습니다. 따라서 그 기능을 사용할 수 있습니다.

QWidget* q = QWidget::find(hwnd);

그러나 여기에 문제가 있습니다. 반환 된 포인터는 항상 0입니다. 코드를 프로세스에 올바르게 주입하지 않습니까? 아니면 qwidget :: find ()를 사용하지 않습니까?

감사,

데이브

편집 : qwidget :: find () 함수를 내 DLL의 내보내기 함수로 변경하면 후크를 설정 한 후 (따라서 중단 점을 설정하고 잡을 수 있음) qwidgetPrivate :: Mapper는 NULL입니다.

도움이 되었습니까?

해결책

답변 :

멍청한 실수, 나는 디버그에서 컴파일하고 있었기 때문에 qtgui4d.dll 및 qtcore4d.dll이었던 qtgui4d.dll 및 qtcore4d.dll은 qtcore4.dll 및 qtgui.dll이 아닌 로딩하는 곳이었습니다.

다른 팁

DLL과 코드에서`qwidgetPrivate :: Mapper의 주소를 비교하십시오. ESP. 하나가 정적으로 연결되어 있으면 두 개의 인스턴스가있을 수 있으며, 각각 고유 한 위젯 세트가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top