Для тех, кто хочет сделать мир лучше.
-
bir3yk
- Полковник
- Сообщения: 1346
- Зарегистрирован: 07.09.2009
- Поблагодарили: 26 раз
#1
Сообщение
10.02.2010, 11:18
нужен аналогичный код для XP вот такой строки
Код: Выделить всё
if(QueryFullProcessImageName(GetCurrentProcess(), NULL, wszProcName, &dwLength) == TRUE)
желательно, чтобы я там больше ничего не правил :)
ну и Psapi.h к нему. Как для примера : должно быть так на выходе: wszProcName = "c:\Steam\Steam.exe"
-
$t@t!c_V()1D
- Разработчик
- Сообщения: 2639
- Зарегистрирован: 06.12.2007
- Благодарил (а): 10 раз
- Поблагодарили: 29 раз
#2
Сообщение
10.02.2010, 13:23
Код: Выделить всё
if ( GetModuleFileNameEx((GetCurrentProcess(),NULL,&buf,sizeof(buf)) )
{
bla();
}
Win SDK писал(а):
Requirements:
- Client Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
- Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.
- Header Declared in Psapi.h.
Добавлено спустя 2 минуты 44 секунды:
Или коль уж для текущего процесса, то можно вообще
Код: Выделить всё
if ( GetModuleFileName(NULL,&buf,sizeof(buf)) )
{
bla();
}
Это можно аж в Win95 провернуть %)
Я надеюсь, я тебя правильно понял?
-
bir3yk
- Полковник
- Сообщения: 1346
- Зарегистрирован: 07.09.2009
- Поблагодарили: 26 раз
#3
Сообщение
10.02.2010, 14:04
сделал так
if ( GetModuleFileNameEx((GetCurrentProcess(),NULL,&buf,sizeof(buf)) )
просто юзал GetProcessImageFileName ...но у него вывод пути уродливое :)
спасибо.
-
$t@t!c_V()1D
- Разработчик
- Сообщения: 2639
- Зарегистрирован: 06.12.2007
- Благодарил (а): 10 раз
- Поблагодарили: 29 раз
#4
Сообщение
10.02.2010, 14:09
Да, вот ещё вот:
Remarks
If you call this [GetModuleFileNameEx] function shortly after creating the process, or if the process was created suspended, the module list may not have been created yet and this function fails with ERROR_INVALID_HANDLE. In this case, the GetProcessImageFileName or (как раз-таки) QueryFullProcessImageName function is more reliable.
по-русски говоря
Примечание
Если вызывать эту [GetModuleFileNameEx] функцию сразу после создания процесса или если процесс был создан и "заморожен" (я не знаю, как точно перевести в данном случае "suspended"), то список модулей мог быть не создан за это время и вызов провалится, вернув ERROR_INVALID_HANDLE. В таком случае использование GetProcessImageFileName или (как раз-таки) QueryFullProcessImageName более надежно.
А GetProcessImageFileName есть и в XP. Тогда так:
Код: Выделить всё
if ( GetProcessImageFileName( GetCurrentProcess(), &buf, sizeof(buf)) )
{
bla();
}
______________
Да, насчет уродливого пути: можешь также заюзать GetFullPathName
Код: Выделить всё
DWORD GetFullPathName(
LPCTSTR lpFileName, // оригинальное имя
DWORD nBufferLength, // размер буфера-приёмника
LPTSTR lpBuffer, // буфер-приёмник
LPTSTR* lpFilePart //указатель в lpBuffer на начало имени файла (если это папка, то этот параметр = NULL)
);
или GetLongPathName
Код: Выделить всё
DWORD GetLongPathName(
LPCTSTR lpszShortPath, // оригинальное имя
LPTSTR lpszLongPath, // буфер-приёмник)
DWORD cchBuffer // размер буфера-приёмника
);
-
bir3yk
- Полковник
- Сообщения: 1346
- Зарегистрирован: 07.09.2009
- Поблагодарили: 26 раз
#5
Сообщение
10.02.2010, 14:21
вот за это огромное спасибо
-
x_000
- Полковник
- Сообщения: 4889
- Зарегистрирован: 25.02.2008
- Откуда: Deutsches Reich
- Благодарил (а): 6 раз
- Поблагодарили: 18 раз
#6
Сообщение
10.02.2010, 15:49
$t@t!c_V()1D писал(а): GetModuleFileName(NULL,&buf,sizeof(buf)
ошибка, если бы ты читал Руссиновича, то знал бы, что GetCurrentProcess возвращает не нуль, а -1
-
$t@t!c_V()1D
- Разработчик
- Сообщения: 2639
- Зарегистрирован: 06.12.2007
- Благодарил (а): 10 раз
- Поблагодарили: 29 раз
#7
Сообщение
10.02.2010, 16:03
x_000
Да, я знаю. Читал, но не у него - в SDK это акже отмечено, просто, чтоб легче было для понимания.
Понятное дело, что можно достать реальный дескриптор, например, через OpenProcess(..., GetCurrentProcessId());