Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизExpandEnvironmentStrings Получение полного пути файла. Найти похожие ветки
← →
Leaner © (2004-09-29 05:14) [0]У меня никак не получается конвертировать строки
типа: \SystemRoot\System32\smss.exe и
\??\C:\Windows\System32\Winlogon.exe в полные пути файла.
Подскажите, пожалуйста, как это можно сделать ?
( прямое применение ExpandEnvironmentStrings не помагает ).
← →
Defunct © (2004-09-29 05:39) [1]ExpandFileName
Pos
Copy
← →
Leaner © (2004-09-29 05:52) [2]ExpandFileName выдает для них:
F:\SystemRoot\System32\smss.exe
F:\??\C:\Windows\System32\Winlogon.exe
F - диск откуда стартует моя программа, а Windows у
меня находится на С.
И, потом, ExpandFileName не конвертирует SystemRoot в Windows
← →
Defunct © (2004-09-29 06:37) [3]чтобы получить системный каталог
GetSystemDirectory
что бы преобразовать это: \??\C:\Windows\System32\Winlogon.exe
воспользуйтесь
Pos
Copy
← →
Leaner © (2004-09-29 06:59) [4]>чтобы получить системный каталог
>GetSystemDirectory
Но ведь вместо SystemRoot, может быть что угодно,
например: ALLUSERSPROFILE
>что бы преобразовать это: \??\C:\Windows\System32\Winlogon.exe
>воспользуйтесь Pos, Copy
Здесь, тоже нет гарантии, что перед путем будет именно \??\
Если бы строка была такая: \%SystemRoot%\hhh.jjj, то
ExpandEnvironmentStrings великолепно бы справился.
Хотелось бы аналогично справиться и с \SystemRoot\hhh.jjj
← →
Defunct © (2004-09-29 07:05) [5]> Если бы строка была такая: \%SystemRoot%
ну так добавьте в нее %%
> Но ведь вместо SystemRoot, может быть что угодно,
тогда задавайте строку по форме, которую требует ExpandEnvironmentStrings
← →
Leaner © (2004-09-29 07:09) [6]>тогда задавайте строку по форме, которую требует >ExpandEnvironmentStrings
Так не я ее задаю, я ее получаю из реестра
или функцией GetModuleFileNameEx
← →
Defunct © (2004-09-29 07:22) [7]> Так не я ее задаю, я ее получаю из реестра
в реестре может быть записано все что попало. каждый производитель софта волен по своему обзывать пути.
> GetModuleFileNameEx
а это что за зверь?
← →
Leaner © (2004-09-29 07:29) [8]>в реестре может быть записано все что попало. каждый >производитель софта волен по своему обзывать пути.
Вот и хочеться их преобразовать. Система, то их понимает
>а это что за зверь?
Аналог GetModuleFileName,только из psAPI
← →
Defunct © (2004-09-29 07:35) [9]> Система, то их понимает
нет не понимает.
проверьте:
Start -> Run -> %SystemRoot%
и
Start -> Run -> SystemRoot
← →
Leaner © (2004-09-29 07:46) [10]Да, Start -> Run -> SystemRoot не поняла...
Но почему, тогда GetModuleFileName выдает такое ?
← →
Игорь Шевченко © (2004-09-29 10:21) [11]
> У меня никак не получается конвертировать строки
> типа: \SystemRoot\System32\smss.exe и
> \??\C:\Windows\System32\Winlogon.exe
Можно вопрос, а нафига ?
← →
Leaner © (2004-09-29 10:29) [12]>Можно вопрос, а нафига ?
Чтобы, например, работать с файлом.
← →
Игорь Шевченко © (2004-09-29 10:36) [13]
> Чтобы, например, работать с файлом.
Второй вопрос - откуда появляются имена файлов с двумя вопросами в начале ?
← →
Leaner © (2004-09-29 10:41) [14]>Второй вопрос - откуда появляются имена файлов с двумя >вопросами в начале ?
GetModuleFileNameEx
← →
Leaner © (2004-09-29 10:44) [15]Вот полный код функции:
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;
← →
Игорь Шевченко © (2004-09-29 10:58) [16]Я бе порекомендовал использовать Toolhelp-функции, они, вроде бы, более правильные имена возвращают. Если не хочется, то строку "\??\" можно просто отбрасывать, она возникает из-за того, что запуск WinLogon выполняется Native-функцией, которой требуется имя файла, начинающееся со знаков вопроса в начале.
Слово SystemRoot можно смело заменять на то, что возвращается функцией GetWindowsDirectory или GetEnvironmentVariable ("SystemRoot", ...)
← →
Leaner © (2004-09-29 11:03) [17]Спасибо, буду пробовать
← →
Leaner © (2004-09-29 11:18) [18]>Игорь Шевченко
У меня, при использовании CreateToolHelp32Snapshot ( под WinXP )
szExeFile возвращает только имя файла, без пути.
← →
Игорь Шевченко © (2004-09-29 12:38) [19]Leaner © (29.09.04 11:18) [18]
Для WinXP пример получения командной строки приложения есть в
http://www.schevchenko.net.ru/SRC/EnumFunctions_60.zip
← →
Leaner © (2004-09-29 19:55) [20]>Игорь Шевченко
Большое спасибо за интересный пример.
Попробовал с ним разобраться и появились вопросы.
У Вас в коде есть такое место:
>// Для преобразования в 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 так и не отобразились нормально.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c