Как получить дескриптор процесса загрузки DLL - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь получить дескриптор процесса, который загрузил DLL из библиотеки DLL.

Мой подход: в DLL_PROCESS_ATTACH я вызываю EnumWindows (EnumWindowsProc, NULL);

моя реализация EnumWindowsProc выглядит следующим образом:

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    if(GetCurrentProcessId() == GetWindowThreadProcessId(hWnd,NULL)){
        MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK);
        return TRUE;
}
    return FALSE;
}

проблема в том, что GetCurrentProcessId () == GetWindowThreadProcessId (hWnd, NULL) никогда не выполняется (если я помещаю вызов messagebox вне блока if, все работает, но он вызывается один раз для каждого перечисленного окна).

Есть ли другой способ добраться до сути? Это неправильный подход или я что-то упускаю?

Спасибо заранее

Ответы [ 4 ]

4 голосов
/ 29 июля 2010

Использовать GetCurrentProcess , который возвращает псевдо-дескриптор текущего процесса.Если вам нужен настоящий дескриптор, передайте псевдо-дескриптор DuplicateHandle .

Обратите внимание, что слишком много делать слишком много в DllMain.Вызывать что-либо, кроме KERNEL32 функций, довольно опасно, и даже тогда есть некоторые KERNEL32 функции, которые вы не должны вызывать.См. Документацию DllMain, этот документ и несколько блогов сообщений от Разработчики Microsoft рекомендуют не делать слишком много в DllMain.

1 голос
/ 29 июля 2010

Самый простой способ - просто использовать GetCurrentProcess всякий раз, когда вам нужен дескриптор.

0 голосов
/ 22 августа 2013

Вы сделали ошибку:

GetWindowThreadProcessId не возвращает идентификатор процесса, но идентификатор потока.

Ваша программа должна быть написана так:

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    DWORD process;
    GetWindowThreadProcessId(hWnd,&process);
    if(GetCurrentProcessId() == process){
        MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK);
        return TRUE;
    }
    return FALSE;
}
0 голосов
/ 29 июля 2010

Попробуйте позвонить GetProcessHandleFromHwnd () .

...