![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из текста вытащить путь к файлу? [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 символа и составляешь строку.