![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ExpandEnvironmentStrings Получение полного пути файла. [D7, Win95/98, WinXP]
Leaner © (2004-09-29 05:14:00)У меня никак не получается конвертировать строки
типа: \SystemRoot\System32\smss.exe и
\??\C:\Windows\System32\Winlogon.exe в полные пути файла.
Подскажите, пожалуйста, как это можно сделать ?
( прямое применение ExpandEnvironmentStrings не помагает ).
Leaner (2004-09-29 19:55:00) [1]>Игорь Шевченко
Большое спасибо за интересный пример.
Попробовал с ним разобраться и появились вопросы.
У Вас в коде есть такое место:
>// Для преобразования в Ansi подсчитывается число символов >//Unicode без
>// завершающего нуля. lstrlenW почему-то дала неверный >//результат. Странно.
> Result:=WideCharLenToString(ATargetCommandLine,Pred(AReturned div SizeOf(WideChar)));
В этом варианте некоторые "CommandLine" теряют последний символ.
Вот пример:
"F:\Delphi Source\Alx Projects\InfoProgram\AlexHelp\AlexHelp.exe"
"C:\Program Files\Common Files\Symantec Shared\ccApp.exe"
"C:\Program Files\Common Files\Symantec Shared\ccEvtMgr.exe
"C:\Program Files\Common Files\Symantec Shared\ccSetMgr.exe
"F:\Delphi Source\Alx Projects\Cerberus_Dir\Cerberus\Cerberus.exe"
"C:\Program Files\Borland\Delphi7\Bin\delphi32.exe"
C:\WINDOWS\Explorer.EX
"C:\Program Files\Borland\InterBase\bin\ibguard.exe
"C:\Program Files\Borland\InterBase\bin\ibserver.exe
"C:\Program Files\ABBYY Lingvo\Lingvo32.exe
"C:\Program Files\ABBYY Lingvo\LvAgent.exe"
"C:\Program Files\Norton AntiVirus\navapsvc.exe
C:\PROGRA~1\NORTON~1\SPEEDD~1\nopdb.ex
"C:\Program Files\Norton SystemWorks\Norton Utilities\NPROTECT.EXE
"C:\Program Files\Norton AntiVirus\SAVScan.exe
C:\WINDOWS\system32\services.ex
\SystemRoot\System32\smss.ex
C:\WINDOWS\system32\svchost -k rpcs
C:\WINDOWS\System32\svchost.exe -k netsvc
"C:\Program Files\Common Files\Symantec Shared\CCPD-LC\symlcsvc.exe
"F:\Delphi Source\Alx Projects\Template\Template.exe"
"F:\Delphi Source\Alx Projects\Tools\TrayLauncher\TrayLauncher.exe"
winlogon.ex
"C:\Program Files\Windows NT\Accessories\WORDPAD.EXE" "F:\TempInfo\TempInfo.wpd
Но, усли убрать Pred(), то все нормально.
Почему Вы сочли необходимым его использовать ?
P.S.
winlogon.ex и \SystemRoot\System32\smss.ex так и не отобразились нормально.
Игорь Шевченко (2004-09-29 12:38:00) [2]Leaner © (29.09.04 11:18) [18]
Для WinXP пример получения командной строки приложения есть в
http://www.schevchenko.net.ru/SRC/EnumFunctions_60.zip
Leaner (2004-09-29 11:18:00) [3]>Игорь Шевченко
У меня, при использовании CreateToolHelp32Snapshot ( под WinXP )
szExeFile возвращает только имя файла, без пути.
Leaner (2004-09-29 11:03:00) [4]Спасибо, буду пробовать
Игорь Шевченко (2004-09-29 10:58:00) [5]Я бе порекомендовал использовать Toolhelp-функции, они, вроде бы, более правильные имена возвращают. Если не хочется, то строку "\??\" можно просто отбрасывать, она возникает из-за того, что запуск WinLogon выполняется Native-функцией, которой требуется имя файла, начинающееся со знаков вопроса в начале.
Слово SystemRoot можно смело заменять на то, что возвращается функцией GetWindowsDirectory или GetEnvironmentVariable ('SystemRoot', ...)
Leaner (2004-09-29 10:44:00) [6]Вот полный код функции:
function ProcessFileName(PID:DWord;Full:Boolean):string;
var
Hand:THandle;
begin
Result:='';
Hand:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID);
if Hand>0 then
try
SetLength(Result,MAX_PATH);
if Full then
if GetModuleFileNameEx(Hand,0,PChar(Result),MAX_PATH)=0 then Result:='' else
else
if GetModuleBaseNameA(Hand,0,PChar(Result),MAX_PATH)=0 then Result:='';
finally
CloseHandle(Hand);
Result:=PChar(Result);
end;
end;
Leaner (2004-09-29 10:41:00) [7]>Второй вопрос - откуда появляются имена файлов с двумя >вопросами в начале ?
GetModuleFileNameEx
Игорь Шевченко (2004-09-29 10:36:00) [8]
> Чтобы, например, работать с файлом.
Второй вопрос - откуда появляются имена файлов с двумя вопросами в начале ?
Leaner (2004-09-29 10:29:00) [9]>Можно вопрос, а нафига ?
Чтобы, например, работать с файлом.
Игорь Шевченко (2004-09-29 10:21:00) [10]
> У меня никак не получается конвертировать строки
> типа: \SystemRoot\System32\smss.exe и
> \??\C:\Windows\System32\Winlogon.exe
Можно вопрос, а нафига ?
Leaner (2004-09-29 07:46:00) [11]Да, Start -> Run -> SystemRoot не поняла...
Но почему, тогда GetModuleFileName выдает такое ?
Defunct (2004-09-29 07:35:00) [12]> Система, то их понимает
нет не понимает.
проверьте:
Start -> Run -> %SystemRoot%
и
Start -> Run -> SystemRoot
Leaner (2004-09-29 07:29:00) [13]>в реестре может быть записано все что попало. каждый >производитель софта волен по своему обзывать пути.
Вот и хочеться их преобразовать. Система, то их понимает
>а это что за зверь?
Аналог GetModuleFileName,только из psAPI
Defunct (2004-09-29 07:22:00) [14]> Так не я ее задаю, я ее получаю из реестра
в реестре может быть записано все что попало. каждый производитель софта волен по своему обзывать пути.
> GetModuleFileNameEx
а это что за зверь?
Leaner (2004-09-29 07:09:00) [15]>тогда задавайте строку по форме, которую требует >ExpandEnvironmentStrings
Так не я ее задаю, я ее получаю из реестра
или функцией GetModuleFileNameEx
Defunct (2004-09-29 07:05:00) [16]> Если бы строка была такая: \%SystemRoot%
ну так добавьте в нее %%
> Но ведь вместо SystemRoot, может быть что угодно,
тогда задавайте строку по форме, которую требует ExpandEnvironmentStrings
Leaner (2004-09-29 06:59:00) [17]>чтобы получить системный каталог
>GetSystemDirectory
Но ведь вместо SystemRoot, может быть что угодно,
например: ALLUSERSPROFILE
>что бы преобразовать это: \??\C:\Windows\System32\Winlogon.exe
>воспользуйтесь Pos, Copy
Здесь, тоже нет гарантии, что перед путем будет именно \??\
Если бы строка была такая: \%SystemRoot%\hhh.jjj, то
ExpandEnvironmentStrings великолепно бы справился.
Хотелось бы аналогично справиться и с \SystemRoot\hhh.jjj
Defunct (2004-09-29 06:37:00) [18]чтобы получить системный каталог
GetSystemDirectory
что бы преобразовать это: \??\C:\Windows\System32\Winlogon.exe
воспользуйтесь
Pos
Copy
Leaner (2004-09-29 05:52:00) [19]ExpandFileName выдает для них:
F:\SystemRoot\System32\smss.exe
F:\??\C:\Windows\System32\Winlogon.exe
F - диск откуда стартует моя программа, а Windows у
меня находится на С.
И, потом, ExpandFileName не конвертирует SystemRoot в Windows
Defunct (2004-09-29 05:39:00) [20]ExpandFileName
Pos
Copy