Страница 1 из 1

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

Добавлено: 10.02.2010, 11:18
bir3yk
нужен аналогичный код для XP вот такой строки

Код: Выделить всё

if(QueryFullProcessImageName(GetCurrentProcess(), NULL, wszProcName, &dwLength) == TRUE)
желательно, чтобы я там больше ничего не правил :)
ну и Psapi.h к нему. Как для примера : должно быть так на выходе: wszProcName = "c:\Steam\Steam.exe"

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

Добавлено: 10.02.2010, 13:23
$t@t!c_V()1D

Код: Выделить всё

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 провернуть %)

Я надеюсь, я тебя правильно понял?

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

Добавлено: 10.02.2010, 14:04
bir3yk
сделал так
if ( GetModuleFileNameEx((GetCurrentProcess(),NULL,&buf,sizeof(buf)) )

просто юзал GetProcessImageFileName ...но у него вывод пути уродливое :)

спасибо.

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

Добавлено: 10.02.2010, 14:09
$t@t!c_V()1D
Да, вот ещё вот:
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 // размер буфера-приёмника
);


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

Добавлено: 10.02.2010, 14:21
bir3yk
вот за это огромное спасибо

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

Добавлено: 10.02.2010, 15:49
x_000
$t@t!c_V()1D писал(а): GetModuleFileName(NULL,&buf,sizeof(buf)
ошибка, если бы ты читал Руссиновича, то знал бы, что GetCurrentProcess возвращает не нуль, а -1

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

Добавлено: 10.02.2010, 16:03
$t@t!c_V()1D
x_000
Да, я знаю. Читал, но не у него - в SDK это акже отмечено, просто, чтоб легче было для понимания.
Понятное дело, что можно достать реальный дескриптор, например, через OpenProcess(..., GetCurrentProcessId());