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

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

Как из текста вытащить путь к файлу? [D7, WinXP]


rolex2002 ©   (2006-04-27 17:15:00) 

Имеется такой текст:
L   \x1\x14\x2     А      FП@      •м'0љ4Ж\x1


rolex2002   (2006-04-27 22:41:00) [1]

Не факт! Вот если у меня 2 винды. И в ярлыке прописано %SysDir% (или как там), то в разной винде будет по разному. Поэтому я и пытаюсь (см 1й пост) считать к какому файлу было последнее обращение.


Volf_555   (2006-04-27 22:38:00) [2]


> Да это-то я как раз знаю. Да только вот бывают ярлыки у
> которых FullPathAndNameOfFileToExecute не совпадает с реальными(!
> ).

А не совпадают они по той причине, что объект, на который указывал этот ярлык или был перемещён, или был удалён. Одно из двух.


rolex2002   (2006-04-27 22:21:00) [3]

To Volf_555: Да это-то я как раз знаю. Да только вот бывают ярлыки у которых FullPathAndNameOfFileToExecute не совпадает с реальными(!). Да-да! Это не фантастика. А если вручную залезть в свойства ярлыка и увидеть там адрес на несуществующий объект, то нажав на кнопку "Найти объект..." на глазах поменяется адрес на "правильный", т.е. тот, где на самом деле находится этот объект. Вот такое вот бывает с некоторыми ярлыками.


Volf_555   (2006-04-27 21:36:00) [4]

Замечание:
LinkInfo.FullPathAndNameOfLinkFile := 'C:\WINNT\Profiles\user\Desktop\FileName.lnk';- значение этой строчки модифицируй под себя (укажи правильный путь к какому-нибудь ярлыку)


Volf_555   (2006-04-27 21:34:00) [5]


> rolex2002   (27.04.06 17:15)  

Как я понял - это файл ярлыка и тебе необходимо получить информацию про него.
Вот подробный пример из DRKB23 (проверял - работает на УРА!):

Как прочитать shortcut's link information?  

uses  
 ShlObj,  
 ComObj,  
 ActiveX,  
 CommCtrl;  

type  
 PShellLinkInfoStruct = ^TShellLinkInfoStruct;  
 TShellLinkInfoStruct = record  
   FullPathAndNameOfLinkFile: array[0..MAX_PATH] of Char;  
   FullPathAndNameOfFileToExecute: array[0..MAX_PATH] of Char;  
   ParamStringsOfFileToExecute: array[0..MAX_PATH] of Char;  
   FullPathAndNameOfWorkingDirectroy: array[0..MAX_PATH] of Char;  
   Description: array[0..MAX_PATH] of Char;  
   FullPathAndNameOfFileContiningIcon: array[0..MAX_PATH] of Char;  
   IconIndex: Integer;  
   HotKey: Word;  
   ShowCommand: Integer;  
   FindData: TWIN32FINDDATA;  
 end;  

procedure GetLinkInfo(lpShellLinkInfoStruct: PShellLinkInfoStruct);  
var  
 ShellLink: IShellLink;  
 PersistFile: IPersistFile;  
 AnObj: IUnknown;  
begin  
 // access to the two interfaces of the object  
 AnObj       := CreateComObject(CLSID_ShellLink);  
 ShellLink   := AnObj as IShellLink;  
 PersistFile := AnObj as IPersistFile;  

 // Opens the specified file and initializes an object from the file contents.  
 PersistFile.Load(PWChar(WideString(lpShellLinkInfoStruct^.FullPathAndNameOfLinkF ile)), 0);  
 with ShellLink do  
 begin  
   // Retrieves the path and file name of a Shell link object.  
   GetPath(lpShellLinkInfoStruct^.FullPathAndNameOfFileToExecute,  
     SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile),  
     lpShellLinkInfoStruct^.FindData,  
     SLGP_UNCPRIORITY);  

   // Retrieves the description string for a Shell link object.  
   GetDescription(lpShellLinkInfoStruct^.Description,  
     SizeOf(lpShellLinkInfoStruct^.Description));  

   // Retrieves the command-line arguments associated with a Shell link object.  
   GetArguments(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute,  
     SizeOf(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute));  

   // Retrieves the name of the working directory for a Shell link object.  
   GetWorkingDirectory(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy,  
     SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy));  

   // Retrieves the location (path and index) of the icon for a Shell link object.  
   GetIconLocation(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon,  
     SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon),  
     lpShellLinkInfoStruct^.IconIndex);  

   // Retrieves the hot key for a Shell link object.  
   GetHotKey(lpShellLinkInfoStruct^.HotKey);  

   // Retrieves the show (SW_) command for a Shell link object.  
   GetShowCmd(lpShellLinkInfoStruct^.ShowCommand);  
 end;  
end;  

procedure TForm1.Button1Click(Sender: TObject);  
const  
 br = #13#10;  
var  
 LinkInfo: TShellLinkInfoStruct;  
 s: string;  
begin  
 FillChar(LinkInfo, SizeOf(LinkInfo), #0);  
 LinkInfo.FullPathAndNameOfLinkFile := 'C:\WINNT\Profiles\user\Desktop\FileName.lnk';  
 GetLinkInfo(@LinkInfo);  
 with LinkInfo do  
   s := FullPathAndNameOfLinkFile + br +  
     FullPathAndNameOfFileToExecute + br +  
     ParamStringsOfFileToExecute + br +  
     FullPathAndNameOfWorkingDirectroy + br +  
     Description + br +  
     FullPathAndNameOfFileContiningIcon + br +  
     IntToStr(IconIndex) + br +  
     IntToStr(LoByte(HotKey)) + br +  
     IntToStr(HiByte(HotKey)) + br +  
     IntToStr(ShowCommand) + br +  
     FindData.cFileName + br +  
     FindData.cAlternateFileName;  
 Memo1.Lines.Add(s);  
end;  

// Only for D3 or higher.  
// for D1,D2 users: http://www.hitekdev.com/delphi/shellutlexamples.html 



Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php


sicilla   (2006-04-27 19:35:00) [6]

Удалено модератором


Cash   (2006-04-27 19:33:00) [7]

rolex2002:
Дай распечатку HEX таблицы этого текста, с самого начала файла (это важно!).
(Hex Workshop 3.1 это умеет хорошо делать)

Какой размер файла?
Что в файле хранится?
(это тоже важно)


rolex2002   (2006-04-27 18:30:00) [8]

:)
Вот ещё одно облегчение: в конце адреса 100% будет 2 пробела. уже легче.


Palladin   (2006-04-27 18:24:00) [9]

вот тебе другой кусок текста
... d:\windows\ddd.ext.rar. txt ea.exe ...

где тут кончается реальность и начинается хаос? и как тут примерно то? что похоже на обычно?


rolex2002   (2006-04-27 18:20:00) [10]

Ну хотябы тогда чтобы примерно, или обчычно как бывает. Тоесть из предложенного тобой примера она выделила d:\windows\ddd.ext


Palladin   (2006-04-27 18:16:00) [11]

ну вот тебе кусок файла

... d:\windows\ddd.ext 1 ...

ты можешь однозначно сказать "1" это уже не имя файла или еще имя?


rolex2002   (2006-04-27 18:12:00) [12]


> Palladin ©   (27.04.06 18:11) [3]
> однозначно - никак

А помоему вполне реально. Какие символы не могут быть в именах фалов/папок?


Palladin   (2006-04-27 18:11:00) [13]

однозначно - никак


rolex2002   (2006-04-27 18:03:00) [14]


> Прибавляешь 3 символа и составляешь строку.

А вдруг расширение не из 3х символов? Такое бывает.


> Далее читаешь строку до символа '.'

А вдруг в имени папки есть '.'?


sicilla   (2006-04-27 18:00:00) [15]

Сделай поиск по тексту фразы типа ':\' или 'C:\'. Ну вообщем то, что знаешь. Далее читаешь строку до символа '.'. Прибавляешь 3 символа и составляешь строку.


Наверх

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