Каталог экзешника: вопросы по нюансам
От: ptrts  
Дата: 20.03.10 11:02
Оценка:
Добрый день

Делаю первые шаги в 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)?

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

Заранее спасибо за ответы
Re: Каталог экзешника: вопросы по нюансам
От: Jolly Roger  
Дата: 20.03.10 11:45
Оценка:
Здравствуйте, ptrts, Вы писали:

P>Вопрос №1. Неужели чтобы получить хэндл процесса, никак не обойтись без hWnd? При чем здесь окно, ведь процесс как таковой вообще не обязан иметь окна


GetModuleFileName(0, buffer, sizeof(buffer))

P>Вопрос №2. Чем отличается идентификатор процесса (который GetWindowThreadProcessId) от хэндла процесса (который OpenProcess)?


Первая возвращает идентификатор процесса, уникальный в пределах машины, вторая — хёндл ядерного объекта "процесс", уникальный в пределах одного, вызвавшего данную функцию процесса.

На машине не может быть одновременно двух процессов с одинаковым ProcessID и двух потоков с одинаковым ThreadID. Результат вызова GetWindowThreadProcessId в разных процессах для одного и того-же окна вернёт одинаковые ProcessID и ThreadID. А несколько вызовов OpenProcess с одинаковыми параметрами даже в одном процессе вернут разные хёндлы, если между вызовами эти хёндлы не закрывать.

О разнице рассказывать слишком долго, лучше книжку какую-никакую прочитайте.
"Нормальные герои всегда идут в обход!"
Re: Каталог экзешника: вопросы по нюансам
От: Jolly Roger  
Дата: 20.03.10 11:56
Оценка:
Здравствуйте, ptrts, Вы писали:

P>Вопрос №1. Неужели чтобы получить хэндл процесса, никак не обойтись без hWnd? При чем здесь окно, ведь процесс как таковой вообще не обязан иметь окна


Конечно нет, ведь у процесса может вообще не быть окон. Его можно получить так

OpenProcess(GetCurrentProcessId(), ...

Во многих случаях и этого не надо, достаточно получить так называемый псевдохёндл вызовом GetCurrentProcess, которая по факту всегда возвращает константу == (DWORD)-1.
"Нормальные герои всегда идут в обход!"
Re[2]: Каталог экзешника: вопросы по нюансам
От: ptrts  
Дата: 20.03.10 14:07
Оценка:
Спасибо, вы мне очень помогли)
Re: Каталог экзешника: вопросы по нюансам
От: gear nuke  
Дата: 21.03.10 19:20
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.