Pergunta

Eu tenho um Qt Dll que injetei em um aplicativo de terceiros usando o Windows Detours Library:

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))

E então eu defino um gancho em todo o sistema para interceptar a criação de janelas:

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);

Onde XOR é o nome do meu programa e o status :: getInstance () é um singleton onde eu mantenho globais.

No meu retorno de chamada do CBTPROC, quero interceptar todas as janelas que são QWidgets:

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

O que funciona bem, desde que recebo um HWND correspondente (verifiquei com SPY ++), quero obter um ponteiro para o Qwidget, para que eu possa usar suas funções:

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

Mas aqui está o problema, o ponteiro retornado é sempre 0. Não estou injetando meu código no processo corretamente? Ou não estou usando QWidget :: find () como deveria?

Obrigado,

Dave

EDIT: Se eu alterar a função Qwidget :: find () para uma função exportada da minha DLL, depois de definir os ganchos (para que eu possa definir e capturar um ponto de interrupção), QwidgetPrivate :: Mapper é nulo.

Foi útil?

Solução

Respondidas:

Erro estúpido, eu estava compilando em depuração, então era qtgui4d.dll e qtcore4d.dll onde carregando, não qtcore4.dll e qtgui.dll

Outras dicas

Compare os endereços de `qwidgetPrivate :: Mapper na DLL e no seu código. Esp. Se alguém estiver vinculado estaticamente, pode haver duas instâncias, cada uma com seu conjunto de widgets, disjunto e sem widgets.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top