Значок извлечения из Windows .lnk (ярлык) файл

Давайте начнем с диапазона BigInt : от -2 ^ 63 (-9,223,372,036,854,775,808) до 2 ^ 63-1 (9,223,372,036,854,775,807). Это примерно ± 9E + 18, поэтому -4,66606E + 22 маловероятно BigInt.

Перейдем к сравнению значений различных типов данных:

declare @Foo as BigInt = 8765432109876543210;
declare @FloatFoo as Float(24) = @Foo, @DoubleFoo as Float(53) = @Foo;

-- According to the rules for data type preedence a BigInt value will be converted to a Float
--   when the two data types are compared. Hence all of the values are "equal".
select @Foo as Foo,
  @FloatFoo as FloatFoo, case when @Foo = @FloatFoo then 1 else 0 end as FloatMatch,
  @DoubleFoo as DoubleFoo, case when @Foo = @DoubleFoo then 1 else 0 end as DoubleMatch;

-- Since a Float(53) has a precision of 15 digits that means some precision will be lost.
set @Foo += 1; -- Bump the BigInt value, but leave the Floats unchanged.
-- And ... the values are all still "equal"!
select @Foo as Foo,
  @FloatFoo as FloatFoo, case when @Foo = @FloatFoo then 1 else 0 end as FloatMatch,
  @DoubleFoo as DoubleFoo, case when @Foo = @DoubleFoo then 1 else 0 end as DoubleMatch;

-- Once more, with feeling.
set @Foo += 1000; -- A bigger bump makes the Float(53) value different, but not the Float(24).
select @Foo as Foo,
  @FloatFoo as FloatFoo, case when @Foo = @FloatFoo then 1 else 0 end as FloatMatch,
  @DoubleFoo as DoubleFoo, case when @Foo = @DoubleFoo then 1 else 0 end as DoubleMatch;

Ссылки: Приоритет типа данных , Float .

Резюме: «Имеются неверные данные со значением bigint. Значение - -4.66606E+22». Это действительно плохие данные. А сравнение значений BigInt и Float является неточной деятельностью, которая может привести к разочарованию.

7
задан 5 December 2008 в 08:31
поделиться

3 ответа

Этот поток обеспечивает интересную информацию о данных, содержавшихся в .lnk файле

Функция sSHGetFileInfoss должна смочь извлечь файл значка.

Зарегистрированный здесь и используемый для lnk файла:

Path2Link := 'C:\Stuff\TBear S Saver.lnk';
SHGetFileInfo(PChar(Path2Link), 0, ShInfo1, SizeOf(TSHFILEINFO),
          SHGFI_ICON);
// this ShInfo1.hIcon will have the Icon Handle for the Link Icon with
// the small ShortCut arrow added}

Из первой ссылки Вы могли создать такую утилиту в c#, где Вы объявите эту функцию как:

[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(
   string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, 
   uint cbSizeFileInfo, uint uFlags);

Вы могли, также создал утилиту на autoit языке сценария, где Вы будете использовать ту функцию, объявленную как это:

Func _ShellGetAssocIcon(Const $szFile,Const $IconFlags = 0)
    Local $tFileInfo = DllStructCreate($tagSHFILEINFO)
    If @error Then
        Return SetError(1,@extended,0)
    EndIf

    Local $Ret = DllCall("shell32.dll","int","SHGetFileInfo","str",$szFile,"dword",0, _
        "ptr",DllStructGetPtr($tFileInfo),"uint",DllStructGetSize($tFileInfo),"uint",BitOr($SHGFI_ICON,$IconFlags))
    MsgBox(0,0,@error)
    Return DllStructGetData($tFileInfo,"hIcon")
EndFunc
6
ответ дан 6 December 2019 в 12:56
поделиться

Можно также проанализировать .lnk файл сами, видеть этот PDF или эту статью о деталях формата файла ярлыка.

Или можно использовать класс ShellLink, упомянутый в ответе на этот вопрос.

1
ответ дан 6 December 2019 в 12:56
поделиться

Чтобы добавить к этому еще несколько ресурсов, потому что, вероятно, у вас нет значка приложения, а не значка с ярлыком в левом нижнем углу:

0
ответ дан 6 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: