Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо