Добрый день
Делаю первые шаги в VC++ (до этого, давно-давно, в институте, програмил на C++ под DOS)
Поставил себе первую задачу, и, в рамках этой моей первой задачи, понадобилась глобальная переменная с каталогом экзешника.
На форумах нашел для этого дела пример, и сделал из него такую процедуру
void GetMainExeName(PTCHAR ExeName, HWND hWnd)
{
DWORD ProcessId;
HANDLE hProcess;
HMODULE hModule;
DWORD cbNeeded;
GetWindowThreadProcessId(hWnd, &ProcessId);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, ProcessId);
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded);
GetModuleFileNameEx(hProcess, hModule, ExeName, sizeof(ExeName));
CloseHandle(hProcess);
}
Задумывалось, что сия процедура будет вызываться в _tWinMain(...) и инициализировать, значит, мою глобальную переменную.
Сразу возникли вопросы.
Вопрос №1. Неужели чтобы получить хэндл процесса, никак не обойтись без hWnd? При чем здесь окно, ведь процесс как таковой вообще не обязан иметь окна
Вопрос №2. Чем отличается идентификатор процесса (который GetWindowThreadProcessId) от хэндла процесса (который OpenProcess)?
Сразу скажу, что задача не в том, чтобы получить каталог, а чтобы разобраться с попутно возникшими вопросами
Заранее спасибо за ответы
Здравствуйте, ptrts, Вы писали:
P>Вопрос №1. Неужели чтобы получить хэндл процесса, никак не обойтись без hWnd? При чем здесь окно, ведь процесс как таковой вообще не обязан иметь окна
Зависит, что за процесс. Если он твой, то хендл получается вызовом GetCurrentProcess();
Если же процес чужой — то процесс надо как-то идентифицировать, для этого может понадобиться окно, либо перечисление всех процессов (EnumProcesses).
P>Вопрос №2. Чем отличается идентификатор процесса (который GetWindowThreadProcessId) от хэндла процесса (который OpenProcess)?
Есть 2 типа таблиц хендлов: общесистемная, и на каждый процесс своя. ID процесса — это хендл из первой, а хендл процесса — из второй.
P>Сразу скажу, что задача не в том, чтобы получить каталог, а чтобы разобраться с попутно возникшими вопросами
Читай Рихтера и Руссиновича
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth