Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.062 c
1-1096707265
zStas
2004-10-02 12:54
2004.10.17
idBase64Encoder


4-1094886089
beatles_bntu
2004-09-11 11:01
2004.10.17
ani куросор из ресурса


1-1096362766
Drobu
2004-09-28 13:12
2004.10.17
Как отключить Debugger?


9-1087157862
kas-t
2004-06-14 00:17
2004.10.17
GLScene: Удаление объекта после анимации.


1-1096530029
Pushkin
2004-09-30 11:40
2004.10.17
Как из VС передать массив в DLL на Делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский