Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
[Win32] Своего процесса??? 16.10.03 06:53 Число просмотров: 1318
Автор: makeworld Статус: Member Отредактировано 16.10.03 07:00 Количество правок: 1
|
> Тогда не надо морочить себе голову и сделать: > > GetModuleFileName(NULL, Buffer, Length);
Так не подойдет. Мне нужно чтобы этот путь к файлу был как-то ассоциирован с pid'ом процесса. Чтобы например 'пролистать' все процессы с помощью Process32First, Process32Next и сравнивать один из элементов структуры соответствующей каждому процессу и путем к файлу. если пути сходятся - значит и pid из этой структуры принадлежит моему процессу. Но это уже проблема решенная, я использовал Module32First/Module32Next. Появилась проблема с получением списка тредов. Вот эта прога не находит ни одного треда в системе:
#include <windows.h>
#include <iostream.h>
#include <tlhelp32.h>
int main() {
HANDLE tSnap = NULL;
THREADENTRY32 t;
tSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
if (tSnap != INVALID_HANDLE_VALUE) {
if (Thread32First(tSnap, &t)) {
cout << t.th32ThreadID << endl;
while (Thread32Next(tSnap, &t))
cout << t.th32ThreadID << endl;
} else cout << "Thread32First() failed: " << GetLastError() << endl;
} else cout << "CreateToolhelp32Snapshot() failed" << endl;
CloseHandle(tSnap);
return 0;
} ---
|
<programming>
|
[Win32] Полный путь к файлу процесса 14.10.03 06:03
Автор: makeworld Статус: Member
|
из MSDN (описание структуры PROCESSENTRY32):
szExeFile
Path and filename of the executable file for the process.
На самом деле в szExeFile только имя файла. в MSDN ошибка?
в MSDN есть пример, где получается полный путь к файлу процесса, в котором используется функция GetProcessModule() (полный путь к файлу пишется в lpMe32->szExePath). Проблема в том, что для всех процессов
в моей системе (win2000 sp4, тестировал под админом) эта функция возвращает FALSE. GetLastError() выдает либо 5 (Access Denied), либо 18 (There are no more files). Первыми двумя параметрами для этой функции я передаю p.th32ProcessID и p.th32ModuleID соответственно, являющиеся результатом работы Process32{First|Next}(snapshot,&p). Process32{First|Next}() работает нормально и возвращает нормальные пиды существующих в системе процессов (на всякий случай говорю).
Как мне получить полный путь к файлу процесса и что это за косяки с GetProcessModule()? А вообще, мне нужно всего-то определить PID 'самого себя', вот я и просматриваю все процессы в системе и сравниваю полный путь к процессу с GetCommandLine() (прога запускается без параметров). Может кто-нибудь знает способ проще?
Функция GetProcessModule() не системная, поэтому привожу ее код:
BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID,
LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
BOOL bRet = FALSE;
BOOL bFound = FALSE;
HANDLE hModuleSnap = NULL;
MODULEENTRY32 me32 = {0};
// Take a snapshot of all modules in the specified process.
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE)
return (FALSE);
// Fill the size of the structure before using it.
me32.dwSize = sizeof(MODULEENTRY32);
// Walk the module list of the process, and find the module of
// interest. Then copy the information to the buffer pointed
// to by lpMe32 so that it can be returned to the caller.
if (Module32First(hModuleSnap, &me32))
{
do
{
if (me32.th32ModuleID == dwModuleID)
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
}
while (!bFound && Module32Next(hModuleSnap, &me32));
bRet = bFound; // if this sets bRet to FALSE, dwModuleID
// no longer exists in specified process
}
else
bRet = FALSE; // could not walk module list
// Do not forget to clean up the snapshot object.
CloseHandle (hModuleSnap);
return (bRet);
}
|
|
[Win32] Чего тебе вообще надо то? 17.10.03 08:57
Автор: IgorR <Igor Razin> Статус: Member
|
PID свой узнать? Дык GetCurrentProcessId()
|
|
[Win32] Своего процесса??? 14.10.03 11:40
Автор: amirul <Serge> Статус: The Elderman
|
Тогда не надо морочить себе голову и сделать:
GetModuleFileName(NULL, Buffer, Length);
|
| |
[Win32] Своего процесса??? 16.10.03 06:53
Автор: makeworld Статус: Member Отредактировано 16.10.03 07:00 Количество правок: 1
|
> Тогда не надо морочить себе голову и сделать: > > GetModuleFileName(NULL, Buffer, Length);
Так не подойдет. Мне нужно чтобы этот путь к файлу был как-то ассоциирован с pid'ом процесса. Чтобы например 'пролистать' все процессы с помощью Process32First, Process32Next и сравнивать один из элементов структуры соответствующей каждому процессу и путем к файлу. если пути сходятся - значит и pid из этой структуры принадлежит моему процессу. Но это уже проблема решенная, я использовал Module32First/Module32Next. Появилась проблема с получением списка тредов. Вот эта прога не находит ни одного треда в системе:
#include <windows.h>
#include <iostream.h>
#include <tlhelp32.h>
int main() {
HANDLE tSnap = NULL;
THREADENTRY32 t;
tSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
if (tSnap != INVALID_HANDLE_VALUE) {
if (Thread32First(tSnap, &t)) {
cout << t.th32ThreadID << endl;
while (Thread32Next(tSnap, &t))
cout << t.th32ThreadID << endl;
} else cout << "Thread32First() failed: " << GetLastError() << endl;
} else cout << "CreateToolhelp32Snapshot() failed" << endl;
CloseHandle(tSnap);
return 0;
} ---
|
| | |
[Win32] Странно все это 16.10.03 10:53
Автор: amirul <Serge> Статус: The Elderman
|
> > GetModuleFileName(NULL, Buffer, Length); > > Так не подойдет. Мне нужно чтобы этот путь к файлу был > как-то ассоциирован с pid'ом процесса. Чтобы например А так
HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, Pid);
if (hProcess == INVALID_HANDLE_VALUE)
goto fail;
GetModuleFileName(hProcess, Buffer, Length);
CloseHandle(hProcess);
---
> соответствующей каждому процессу и путем к файлу. если пути > сходятся - значит и pid из этой структуры принадлежит моему Ой. По pid-у найти путь, а потом по пути найти pid. Странный подход, надеюсь обоснованный.
> #include <windows.h> > #include <iostream.h>
> #include <tlhelp32.h>
>
> int main() {
> HANDLE tSnap = NULL;
> THREADENTRY32 t;
> tSnap =
> CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
> if (tSnap != INVALID_HANDLE_VALUE) {
> if (Thread32First(tSnap, &t)) {
> cout << t.th32ThreadID
> << endl;
> while (Thread32Next(tSnap, &t))
> cout <<
> t.th32ThreadID << endl;
> } else cout << "Thread32First()
> failed: " << GetLastError() << endl;
> } else cout << "CreateToolhelp32Snapshot()
> failed" << endl;
> CloseHandle(tSnap);
> return 0;
> } ---
Э-э-э-э. Читайте MSDN и да наступит вам счастье "The calling application must set the dwSize member of THREADENTRY32 to the size, in bytes, of the structure. Thread32First"
Было бы неплохо брать GetLastError() тогда ошибка нашлась бы гораздо быстрее :-)
|
| | | |
[Win32] Странно все это 17.10.03 06:45
Автор: makeworld Статус: Member
|
> Ой. По pid-у найти путь, а потом по пути найти pid. > Странный подход, надеюсь обоснованный. Не. Найти путь, а потом сравнивая пути всех процессов с исходным, найти pid. Первой что в голову пришло.
> > Э-э-э-э. Читайте MSDN и да наступит вам счастье "The > calling application must set the dwSize member of > THREADENTRY32 to the size, in bytes, of the structure. > Thread32First" Да.. Уже нашел. Главное для Process32First() и Module32First() тоже самое написано, но и без указания размера структуры все работает.
> > Было бы неплохо брать GetLastError() тогда ошибка нашлась > бы гораздо быстрее :-)
Так у меня брался GetLastError(), если Thread32First ноль возвращал. Только он какую-то лажу выдавал о неверной команде и что-то типа этого.
|
| | | | |
[Win32] Странно все это 17.10.03 13:10
Автор: amirul <Serge> Статус: The Elderman
|
> Да.. Уже нашел. Главное для Process32First() и > Module32First() тоже самое написано, но и без указания > размера структуры все работает. Вообще то надо практически всегда заполнять. Потому как если есть размер, значит структура в принципе variable-sized, так что надо указать размер памяти под текущей структурой. А то что иногда работает, так это уже ошибки микрософта - не проверяют входные параметры. Точно так же вылазит довольно много ошибок с переполнением буфера и другими методами переписывания kernel-space memory. :-)
|
| | | | |
[Win32] Странно все это 17.10.03 08:20
Автор: Killer{R} <Dmitry> Статус: Elderman
|
> Да.. Уже нашел. Главное для Process32First() и > Module32First() тоже самое написано, но и без указания > размера структуры все работает. Прикол в том что иногда работает иногда нет. Сам с этим сталкивался.
|
| | | | |
[Win32] А если твоя прога в нескольких экземплярах? 17.10.03 08:04
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
| | | | | |
[Win32] А если твоя прога в нескольких экземплярах? 18.10.03 06:25
Автор: makeworld Статус: Member Отредактировано 18.10.03 06:30 Количество правок: 1
|
в нескольких экземплярах она не может быть запущена.
2 IgorR: насчет GetCurrentProcessId() - спасибо, не нашел я ее сначала в MSDN.
|
|
|