FindWindowA () возвращает 0, и когда я проверяю код ошибки с помощью GetLastError (), это также 0 (ERROR_SUCCESS) - PullRequest
1 голос
/ 21 апреля 2020

Это фрагмент кода внедрения DLL, который я пишу. Я использую FindWindowA(), чтобы получить HWND для процедур окна, определенных в INJ_PROC_NAME. Проблема в том, что функция всегда возвращает 0, а когда я проверяю ошибку с помощью GetLastError(), она также возвращает 0. Я не могу сказать, в чем проблема, потому что код ошибки не дает мне правильную информацию об ошибке.

HWND Hwnd = FindWindowA(NULL, INJ_PROC_NAME);
    if (Hwnd == NULL)
    {
        std::cout << "Couldn't find window named \"" << INJ_PROC_NAME << "\": error-"
            << GetLastError() << std::endl;
        getchar();
        return -1;
    }

Это вывод:

Couldn't find window named "notepad.exe": error-0

Это известная проблема? Я не смог найти никакой информации об этом в документации Microsoft или переполнении стека. Я просто не могу понять это ...

edit: Очевидно, блокнот открыт, когда я запускаю программу.

1 Ответ

4 голосов
/ 21 апреля 2020

Скорее всего, ошибка вызывает clobberd где-то в std::cout.

Попробуйте:

 if (Hwnd == NULL)
    {
        DWORD error = GetLastError();  // first thing we retrieve the error

        std::cout << "Couldn't find window named \"" << INJ_PROC_NAME << "\": error-"
            << error << std::endl;
        getchar();
        return -1;
    }

В любом случае необходимо сохранить номер ошибки сразу после сбоя, как показано выше.

Но истинная причина, по которой FindWindow не удается, заключается в том, что он ищет не имя процесса , а заголовок окна , который похож на Untitled - Notepad.

В противном случае, если FindWindow не найдет окно, последняя ошибка на самом деле не установлена, несмотря на то, что претендует на документацию Microsoft.

Заключение

Использование FindWindow, вероятно, не лучший подход, вам лучше перечислить процессы, как описано в этой документации Microsoft .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...