Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

либо GetFullPathName тормозит, либо я :)

Hello comp,

GetFullPathName упорно возвращает имя приложения, из которого оно запускается.
А мне
нужен список приложений, который перечисляется с пом. структуры PROCESSENTRY32.
Код
выглядит следующим образом

PROCESSENTRY32 proc;
proc.dwSize=sizeof(PROCESSENTRY32);
CString str, str2;
if (Process32First(hSnap, &proc))
{
if (proc.th32ProcessID==pid){
GetFullPathName(proc.szExeFile, 512, str.GetBuffer(512),
0);
CloseHandle(hSnap);
return str;
}
//m_List1.AddString(proc.szExeFile);
while (Process32Next(hSnap, &proc))
{
if (proc.th32ProcessID==pid){
GetFullPathName(proc.szExeFile, 512, str.GetBuffer(512),
0);
CloseHandle(hSnap);
return str;
}
//m_List1.AddString(proc.szExeFile);
}
}

str должен принять полное имя приложения

Ответить   Sat, 10 Dec 2005 20:31:01 +0300 (#487826)

 

Ответы:

Здравствуйте !

А чему, кстати, pid равен ?
Тут, похоже, просто то что первым попадается, то и возвращается.
Первым попадается твой процесс.

Просто закомментируй CloseHandle(hSnap); и return str в своем примере,
и посмотри под отладчиком что будет.
Кстати, после GetBuffer, надо делать ReleaseBuffer.

А пример перечисления процессов, модулей, и.т.д. можно найти тут:

http://msdn.microsoft.com/library/en-us/perfmon/base/taking_a_snapshot_and_v
iewing_processes.asp

Ответить   Sat, 10 Dec 2005 23:28:03 +0300 (#487899)

 

Hello Victor,

Saturday, December 10, 2005, 11:28:03 PM, you wrote:

Если бы все так просто было :( Мне нужно по хэндлу окна узнать полное имя
приложения,
которому принадлежит это окно. И в первый раз я узнаю полное имя своего приложения.
Все
правильно выводится. Затем даю хэндлы других окон. По отладчику смотрел,
что находится
правильный экзешник, например KAV.exe, но GetFullPathName говорит, что это
приложение
находится там же, что и моя прога. Для моей программульки большая честь, что
Касперский
рядом с ней :), но это не так на самом деле.

Хороший пример - он решил мою проблему, потому что в MODULEENTRY32.szExePath
сразу
содержится то, что мне нужно. Поэтому вопрос с GetFullPathName остается
чисто
риторическим.

Ответить   Sun, 11 Dec 2005 14:05:16 +0300 (#488076)

 

Ну, риторическим, так риторическим. Но разве не интересно, почему не
работало? Чтоб снова на грабли не наступать? "Умный...", конечно, "... гору
обойдёт", но для этого он должен быть в первую очередь умным. А просто
обойти проблему вместо выяснения её причин... Был у меня один коллега на
предыдущем месте работы, так он выключал все опции компилятора, которые
ведают run-time проверками (переполнений там всяких, ввода/вывода - он да
Delphi писал) с мотивацией, что с ними у него программа не работает, а без
них всё классно.
На вот из MSDN-а, если ещё не читал:
If you use the pointer returned by GetBuffer to change the string contents,
you must call ReleaseBuffer before using any other CString methods.

The address returned by GetBuffer may not be valid after the call to
ReleaseBuffer since additional CString operations may cause the CString
buffer to be reallocated. The buffer will not be reallocated if you do not
change the length of the CString.

The buffer memory will be freed automatically when the CString object is
destroyed.

Note that, if you keep track of the string length yourself, you should not
append the terminating null character. You must, however, specify the final
string length when you release the buffer with ReleaseBuffer. If you do
append a terminating null character, you should pass -1 for the length to
ReleaseBuffer, which will perform a _tcslen on the buffer to determine its
length.

Ни на какие мысли не наводит? По ходу, пока не вызовешь ReleaseBuffer(),

никаких изменений в CString и не увидишь. Наверное.
Ну и кроме того (особенно последнее предложение):
GetFullPathName merges the name of the current drive and directory with the
specified file name to determine the full path and file name of the
specified file. It also calculates the address of the file name portion of
the full path and file name. This function does not verify that the
resulting path and file name are valid or that they see an existing file on
the associated volume.

Так что неполохо бы проверить возвращаемый BOOL и если он FALSE, то и
GetLastError()

--
С уважением, boroda

Номер выпуска : 5084
Возраст листа : 813 (дней)
Количество подписчиков : 546
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/488506
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Mon, 12 Dec 2005 14:08:17 +0300 (#488506)

 

Ваабще-то в szEXENAME только в 98-й винде лежит путь к файлу. А в
ХРюше эту инфу надо нарывать из подключенных модулей - первый модуль
кажись и есть исполняемый файл - не помню счас. Там мона и
подгруженные библии для особо интересующихся посмотреть...
А тормозит здесь явно не функция. 8)
Кстати, GetFullPathName предназначена не для получения пути из
экзешника, а для получения полного пути из короткого. Сам подумай - у
тебя лежат два файла test.exe в папках "c:\folder 1" и "c:\folder 2" -
даже человек не сможет вернуть тебе правильный путь от одного лишь
имени экзешника - не то что винда! А в GetFullPathName ты сообщаешь
ТОЛЬКО имя exe - ни идентификатора процесса, ни хотя бы хэндла...

Короче, вот те функция на VB6, а на сях я её засунул куда-то глубоко:

Public Function GetFileNameById(ByVal lngProcId As Long)
Dim i As Long, hProcess As Long, strBuf As String
Dim cb As Long, hModule As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lngProcId)
If hProcess <> 0 Then
EnumProcessModules hProcess, hModule, 4, cb
strBuf = String$(256, vbNullChar)
cb = GetModuleFileNameEx(hProcess, hModule, strBuf, 256)
If cb > 0 Then
GetFileNameById = Left$(strBuf, cb)
End If
End If
Call CloseHandle(hProcess)
End Function

Куда уж понятнее - на С++ думаю труда не составит перевести.

Номер выпуска : 5086
Возраст листа : 815 (дней)
Количество подписчиков : 545
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/489511
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Wed, 14 Dec 2005 02:51:54 +0500 (#489511)

 

Здравствуйте, Neco.

Wednesday, December 14, 2005, 12:51:54 AM, Вы писали:

Кто тормозит - это понятно. Вопрос, как правильно заметил Шматко, интересен
тем, почему
именно GetFullPathName не работает в данном случае.

Тогда зачем вообще существует GetFullPathName?

lngProcId)

Пример хорош и раньше я им пользовался, пока не возникла потребность поддержки
Win98.

Ответить   Wed, 14 Dec 2005 23:22:22 +0300 (#490134)

 

Я ещё спрашивал, что она возвращает, и если FALSE, то чему равен
GetLastError()

Чтобы из "..\FAR\Far.exe" получить "D:\Program Files\Far\Far.exe". Не
важно при этом, есть ли действительно по этому пути far.exe А может быть и
часть самого пути к нему. Правда, не в курсе, как она отнесётся к UNC.
То есть, имея относительный путь, она его преобразует в полный. Так как
относительный путь наверняка будет считаться от текущего каталога (на
текущем томе, если иной не указан явно) твоего приложения, то подозреваю, в
этом и есть проблема. И примерно это имел ввиду Neco, ИМХО

--
С уважением, boroda

Номер выпуска : 5088
Возраст листа : 816 (дней)
Количество подписчиков : 543
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/490162
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Thu, 15 Dec 2005 08:19:58 +0300 (#490162)

 

Hello Шматко,

Thursday, December 15, 2005, 8:19:58 AM, you wrote:

не FALSE - это давно проверил.

и

как

в

То есть в принципе с пом. GetCurrentDir можно обойтись и без GetFullPathName?
Но если все
файлы разбросаны по папкам, которые никак не связаны с текущим каталогом, то
как быть?

Ответить   Thu, 15 Dec 2005 23:33:21 +0300 (#490639)

 

Ну да.

std::basic_string<TCHAR>(GetCurrentDirectory()) + TEXT(\\..\\FAR\\Far.exe)
/* на самом деле первый "\\", который перед "..", будет избыточен, если
текущим каталогом является корень тома */

и получим что-то вроде "d:\\Program
Files\\MyCoolProject\\..\\FAR\\Far.exe", а потом ищем все ".." и удаляем
предшествующие элементы маршрута. Алгоритм несложен. Но зачем он нужен, если

есть GetFullPathName()? Вот мне как-то понадобилась обратная функция (чтобы
сравнить с полным маршрутом и выбрать более короткий вариант), так пришлось
самому писать.

Ну так хоть относительные маршруты к ним должны же быть? Иначе как ты и
без полных, и без коротких путей доступаться к ним собрался??
Кстати, вот это - "C:SYSTEM32\\win32k.sys" при текущем каталоге на C:
"C:\WINDOWS" и текущем томе "E:" - тоже относительный маршрут. Так что нужно

ещё и текущий том учитывать.

--
С уважением, boroda

Номер выпуска : 5094
Возраст листа : 817 (дней)
Количество подписчиков : 542
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/490671
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Fri, 16 Dec 2005 12:58:23 +0300 (#490671)

 

GetFullPathName это антиGetShortPathName
т.е. из байды с разными там PROGRAM~ делает program files

Номер выпуска : 5089
Возраст листа : 817 (дней)
Количество подписчиков : 543
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/490558
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 16 Dec 2005 02:49:16 +0300 (#490558)

 

Не-а. Почитай внимательно MSDN. Это ты путаешь с GetLongFileName()

--
С уважением, boroda

Номер выпуска : 5090
Возраст листа : 817 (дней)
Количество подписчиков : 542
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/490601
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Fri, 16 Dec 2005 09:47:05 +0300 (#490601)

 

Здравствуйте, Николай Увалиев!

Это делает GetLongPathName.

С уважением, AleX

Номер выпуска : 5091
Возраст листа : 817 (дней)
Количество подписчиков : 542
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/490638
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 16 Dec 2005 04:20:37 +0300 (#490638)