Появилась проблема при использование функции FileGetShortcut, если скрипт скомпилирован под х86. При проверке ярлыка на осх64 не правильно возвращался путь, например в ярлыке указан путь C:\Program Files\Internet Explorer\iexplore.exe то функция вернет C:\Program Files(х86)\Internet Explorer\iexplore.exe
Нашел такую функцию на C#
Перевел её на AutoIt, вроде путь возвращается правильный. Может есть уже проверенный способ?
Нашел такую функцию на C#
Код:
string GetFullPath(FileInfo file)
{
if (file.Extension == ".lnk") {
using (var fstream = File.Open(file.FullName, FileMode.Open, FileAccess.Read)) {
using (var reader = new BinaryReader(fstream)) {
fstream.Seek(0x14, SeekOrigin.Begin);
var flags = reader.ReadUInt32();
if (( flags & 0x01 ) == 1) {
fstream.Seek(0x4c, SeekOrigin.Begin);
var itemIdLength = reader.ReadUInt16();
fstream.Seek(itemIdLength, SeekOrigin.Current);
}
var start = fstream.Position;
var length = reader.ReadUInt32();
fstream.Seek(0x0c, SeekOrigin.Current);
var offset = reader.ReadUInt32();
fstream.Seek(start + offset, SeekOrigin.Begin);
return new string(reader.ReadChars((int)( start + length - fstream.Position )));
}
}
} else
return file.FullName;
}
Перевел её на AutoIt, вроде путь возвращается правильный. Может есть уже проверенный способ?
Код:
$sStr = _GetFullPathLnk('Internet Explorer (64-bit).lnk')
MsgBox(4096, "Path", $sStr)
Func _GetFullPathLnk($sPathLnk)
Local $iflags, $itemIdLength, $istart, $ilength, $ioffset, $ilength_path
Local $sPathFull, $aPathFull
Local $hFile = FileOpen($sPathLnk, 16)
; Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
If $hFile = -1 Then
MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
Return SetError(1, 0, '')
EndIf
If Not FileSetPos($hFile, 0x14, 0) Then ;begin
FileClose($hFile)
Return SetError(2, 0, '')
EndIf
$iflags = FileRead($hFile, 4)
If BitAND($iflags, 0x01) = 1 Then
If Not FileSetPos($hFile, 0x4c, 0) Then ;begin
FileClose($hFile)
Return SetError(2, 0, '')
EndIf
$itemIdLength = FileRead($hFile, 2)
$itemIdLength = Int($itemIdLength)
If Not FileSetPos($hFile, $itemIdLength, 1) Then ;current
FileClose($hFile)
Return SetError(2, 0, '')
EndIf
EndIf
$istart = FileGetPos($hFile)
$ilength = FileRead($hFile, 4)
$ilength = Int($ilength)
If Not FileSetPos($hFile, 0x0c, 1) Then ;current
FileClose($hFile)
Return SetError(2, 0, '')
EndIf
$ioffset = FileRead($hFile, 4)
$ioffset = Int($ioffset)
If Not FileSetPos($hFile, $istart + $ioffset, 0) Then ;begin
FileClose($hFile)
Return SetError(2, 0, '')
EndIf
$ilength_path = ($istart + $ilength) - FileGetPos($hFile)
$sPathFull = FileRead($hFile, $ilength_path)
FileClose($hFile)
$sPathFull = BinaryToString($sPathFull)
$aPathFull = StringRegExp($sPathFull, '(.+?\.\w+)', 1)
If @error Then
Return SetError(3, 0, '')
EndIf
$sPathFull = $aPathFull[0]
If $sPathFull Then
Return $sPathFull
Else
Return SetError(4, 0, '')
EndIf
EndFunc ;==>_GetFullPathLnk