Creating internet shortcuts: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
(Added URL PIDL details)
Line 29: Line 29:
Section
Section


!insertmacro CreateInternetShortcut "$Desktop\Example1.URL" "http://example.com"
!insertmacro CreateInternetShortcut "$Desktop\Example1.URL" "http://example.net/path?query#frag"
!insertmacro CreateInternetShortcutWithIcon "$Desktop\Example2.URL" "http://example.net/path?query#frag" "$windir\explorer.exe" 13
!insertmacro CreateInternetShortcutWithIcon "$Desktop\Example2.URL" "http://example.com" "$windir\explorer.exe" 13


SectionEnd
SectionEnd
Line 82: Line 82:
</pre></code>
</pre></code>


* Bookmarklet:ExtendedURL allows bookmarklets [https://translate.google.com/translate?sl=auto&tl=en&u=https://habr.com/ru/post/263443/ up to 5119 characters] while the normal InternetShortcut:URL field is limited to 2083 characters.




Line 137: Line 138:
SectionEnd
SectionEnd
</highlight-nsis>
</highlight-nsis>
== URLs in .LNK shortcuts ==
Most Windows versions can parse and store URLs in the shell namespace. Because .LNK shortcut files can contain a [https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/cc144089(v=vs.85) PIDL] you can put a PIDL URL in a .LNK shortcut. The result is not ideal because not all Windows versions display the default URL icon correctly. The URL PIDL format is not documented nor stable across all Windows versions.
* NT4 (IE2) cannot handle URL PIDLs? <!--(Unable to create working .LNK)-->
* 95.OSR2 (IE3) stores URLs as ANSI PIDLs: <code>[?] [61h,00h,http:...#frag]</code> <!--(Unable to create working .LNK)-->
* 98 (IE4) stores URLs as ANSI PIDLs: <code>[INTERNET] [61h:00h:00000000h,http:...] [61h:01h:00000000h,#frag]</code>
* 98.SE (IE5) stores URLs as Unicode PIDLs: <code>[INTERNET] [61h:80h:00000000h,http:...,BEEF...,#frag]</code>

Revision as of 16:29, 4 June 2019

Author: Anders (talk, contrib)


Introduction

Internet shortcuts cannot be created with the CreateShortcut NSIS instruction because they are a different file type (.URL, not .LNK).

.URL files are actually just .INI files and can be created/edited with the NSIS INI instructions.


Writing .URL files directly as a .INI file

While technically not the correct way to create .URL files, you can write them directly with the WriteINIStr instruction or use simple helper macros:

!macro CreateInternetShortcut FILEPATH URL
WriteINIStr "${FILEPATH}" "InternetShortcut" "URL" "${URL}"
!macroend
 
!macro CreateInternetShortcutWithIcon FILEPATH URL ICONPATH ICONINDEX
WriteINIStr "${FILEPATH}" "InternetShortcut" "URL" "${URL}"
WriteINIStr "${FILEPATH}" "InternetShortcut" "IconIndex" "${ICONINDEX}"
WriteINIStr "${FILEPATH}" "InternetShortcut" "IconFile" "${ICONPATH}"
!macroend
Section
 
!insertmacro CreateInternetShortcut "$Desktop\Example1.URL" "http://example.net/path?query#frag"
!insertmacro CreateInternetShortcutWithIcon "$Desktop\Example2.URL" "http://example.com" "$windir\explorer.exe" 13
 
SectionEnd


The .URL file format

The .URL file format is not officially documented. Only the URL value in the InternetShortcut section is required, everything else is optional.

[InternetShortcut]
URL=
HotKey=
IconFile=
IconIndex=
ShowCommand=
Modified=
Roamed=
IDList=
Author=
WhatsNew=
Comment=
Desc=

[DEFAULT] ; HTML frameset
BASEURL=

[DOC<NestedFramesetInfo>]
BASEURL=
ORIGURL=

[Bookmarklet] ; JavaScript bookmarklet
ExtendedURL=

[MonitoredItem]
FeedUrl=
IsLivePreview=
PreviewSize=

[{000214A0-0000-0000-C000-000000000046}] ; FMTID_Intshcut property storage
Prop<2..2147483647>=
  • Bookmarklet:ExtendedURL allows bookmarklets up to 5119 characters while the normal InternetShortcut:URL field is limited to 2083 characters.


Using the IUniformResourceLocator interface

Using the IUniformResourceLocator interface is the documented way to create/read/write .URL files.

IUniformResourceLocator helper macros were added in NSIS v3.05.

!include LogicLib.nsh
!include Win\COM.nsh
!include Win\PropKey.nsh
 
Section
 
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_InternetShortcut} ${IID_IUniformResourceLocator} r1 ""
${If} $1 P<> 0
  ${IUniformResourceLocator::SetURL} $1 '("http://example.com?simple")'
  ${IUnknown::QueryInterface} $1 '("${IID_IPersistFile}",.r2)'
  ${If} $2 P<> 0
    ${IPersistFile::Save} $2 '("$Desktop\Example4.URL",1)'
    ${IUnknown::Release} $2 ""
  ${EndIf}
  ${IUnknown::Release} $1 ""
${EndIf}
 
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_InternetShortcut} ${IID_IUniformResourceLocator} r1 ""
${If} $1 P<> 0
  ${IUniformResourceLocator::SetURL} $1 '("http://example.com?propstorage")'
  ${IUnknown::QueryInterface} $1 '("${IID_IPropertySetStorage}",.r2)'
  ${If} $2 P<> 0
      ${IPropertySetStorage::Open} $2 '("${FMTID_Intshcut}", ${STGM_READWRITE}, .r3)'
      ${If} $3 P<> 0
        System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_LPWSTR},,,&w${NSIS_MAX_STRLEN} "$windir\explorer.exe")p.r5' ; Allocate PROPVARIANT + string buffer
        IntPtrOp $6 $5 + ${SYSSIZEOF_PROPVARIANT} ; Calculate string address
        ${V_SetPointer} $5 "" $6
        !insertmacro IPropertyStorage_WritePropById $3 ${PID_IS_ICONFILE} $5 ""
        ${V_SetInt32} $5 ${VT_I4} 8
        !insertmacro IPropertyStorage_WritePropById $3 ${PID_IS_ICONINDEX} $5 ""
        System::Free $5 ; Free PROPVARIANT
        ${IPropertyStorage::Commit} $3 '(${STGC_DEFAULT})'
      ${IUnknown::Release} $3 ""
    ${EndIf}
    ${IUnknown::Release} $2 ""
  ${EndIf}
  ${IUnknown::QueryInterface} $1 '("${IID_IPersistFile}",.r2)'
  ${If} $2 P<> 0
    ${IPersistFile::Save} $2 '("$Desktop\Example5.URL",1)'
    ${IUnknown::Release} $2 ""
  ${EndIf}
  ${IUnknown::Release} $1 ""
${EndIf}
 
SectionEnd


URLs in .LNK shortcuts

Most Windows versions can parse and store URLs in the shell namespace. Because .LNK shortcut files can contain a PIDL you can put a PIDL URL in a .LNK shortcut. The result is not ideal because not all Windows versions display the default URL icon correctly. The URL PIDL format is not documented nor stable across all Windows versions.

  • NT4 (IE2) cannot handle URL PIDLs?
  • 95.OSR2 (IE3) stores URLs as ANSI PIDLs: [?] [61h,00h,http:...#frag]
  • 98 (IE4) stores URLs as ANSI PIDLs: [INTERNET] [61h:00h:00000000h,http:...] [61h:01h:00000000h,#frag]
  • 98.SE (IE5) stores URLs as Unicode PIDLs: [INTERNET] [61h:80h:00000000h,http:...,BEEF...,#frag]