Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.036 c
1-1096874209
Rem
2004-10-04 11:16
2004.10.17
Ресурс


3-1095759041
}|{yk
2004-09-21 13:30
2004.10.17
Права доступа к Firebird


3-1095174226
DIS
2004-09-14 19:03
2004.10.17
отчет Fastreport


14-1096145605
Murkt
2004-09-26 00:53
2004.10.17
Rammstein - Reise, Reise


6-1092054959
Filya
2004-08-09 16:35
2004.10.17
Sokcet