C ++ - FindWindow Win32 API всегда терпит неудачу! - PullRequest
1 голос
/ 19 декабря 2010

У меня проблема с функцией FindWindow () в C ++.Я использую две программы - Программу A и Программу B. Обе являются консольными приложениями в нативном коде.Программа A инициализирует int i и строку s значениями.Программа B считывает их из памяти программы A, используя адреса, показанные при запуске программы A.В настоящее время меня интересует только чтение значения 'i'.

Я не могу заставить FindWindow () работать, хотя и не знаю, почему:довольно новый в этом купе.

ПРОГРАММА A:

#include <Windows.h>
#include <string>
#include <iostream>

using namespace std;

int main() {
    SetConsoleTitle(L"PROGRAM_A");

    string s = "Kuken\0";
    int i = 12345;
    char choice;

    int* ptr_i = &i;
    string* ptr_s = &s;

    cout << "ADDRESSES: \n";
    cout << "Int i: " << ptr_i << "\n";
    cout << "String s: " << ptr_s << "\n\n";

    cout << "INITIAL VALUES: \n";
    cout << "Int i: " << i << "\n";
    cout << "String s: " << s << "\n\n";

    cout << "***Read/Modify this process memory with programB and view new values! \n\n";


    while (true) {
        cout << "Print values of i and s? y/n \n";
        cin >> choice;
        switch (choice) {
        case 'y': 
            cout << "i: " << *ptr_i << "\n";
            cout << "s: " << *ptr_s << "\n";
            break;
        default:
        break;
        }

    }

    return 0;
    }

ПРОГРАММА B:

#include <Windows.h>
#include <iostream>
#include <string>



int main() {
    HWND handle_temp;
    unsigned long pid;
    int buffer[1];
    std::wstring name = L"PROGRAM_A";

    int temp;
    int* ptr_i;
    std::string* ptr_s;

    std::cout << "Type the address of i in programA: ";
    std::cin >> std::hex >> temp;
    std::cout << "\n";
    ptr_i = (int*)temp;

    std::cout << "Type the address of s in programA: ";
    std::cin >> std::hex >> temp;
    std::cout << "\n\n";
    ptr_s = (std::string*)temp;

    handle_temp = FindWindow(NULL,name.c_str());
    if (!FindWindow(NULL,name.c_str())) {
        std::cout << "Error: Did not find window \n";
        std::cout << "src: " << ptr_i << "\n";
    }
    GetWindowThreadProcessId(handle_temp,&pid);
    HANDLE handle_prgmA = OpenProcess(PROCESS_VM_READ,0,pid);



    if (ReadProcessMemory(handle_prgmA,ptr_i,&buffer,4,NULL)) {
        std::cout << buffer[0];
    }
    else {
        std::cout << "Could not read memory";

}

CloseHandle(handle_prgmA);

while (true) {
    std::cin >> temp;
}

}

Ответы [ 2 ]

4 голосов
/ 19 декабря 2010

Это не может работать так, как вы хотите. Даже если вызов FindWindow будет успешным: окно не создано вашей консольной программой. Вместо этого в Windows есть отдельный серверный процесс, который заботится о создании окна консоли, поэтому несколько процессов могут совместно использовать одно окно консоли.

Вместо этого я рекомендую разрешить прямой ввод идентификатора процесса, например, после получения его у менеджера программы. Если вы действительно хотите найти процесс по заголовку окна, вам нужно использовать CreateWindow в процессе A.

Редактировать : Вы можете использовать EnumProcesses , чтобы найти ваш процесс в списке всех процессов.

0 голосов
/ 19 декабря 2010

IIRC, FindWindow для работы требуется цикл сообщений.Поскольку в консольных окнах нет цикла сообщений, которым вы управляете, он не работает.

...