маленький вопрос к сишникам ;)

Для тех, кто хочет сделать мир лучше.
Ответить
Сообщение
Автор
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());

Ответить