少し前に作った、
http://codetter.com/?p=1041
を元に作成。
AppUserModelIDを省いてあります。
// ショートカット作成
#module mCOMOBJMACRO
#define global ctype SUCCEEDED(%1) ((%1) >= 0)
#define global SafeRelease(%1) if ((varuse(%1)) && (vartype(%1) == 6)){ \
delcom %1: \
%1 = 0 \
}
#global
#module mSHORTCUT
#define CLSID_ShellLink "{00021401-0000-0000-C000-000000000046}"
#define IID_IShellLink "{000214EE-0000-0000-C000-000000000046}"
#usecom IShellLink IID_IShellLink CLSID_ShellLink
#comfunc IShellLink_SetArguments 11 str
#comfunc IShellLink_SetIconLocation 17 str, int
#comfunc IShellLink_SetPath 20 str
#define IID_IPersistFile "{0000010b-0000-0000-C000-000000000046}"
#usecom IPersistFile IID_IPersistFile
#comfunc IPersistFile_Save 6 wstr, int
#define IID_IPropertyStore "{886d8eeb-8cf2-4446-8d02-cdba1dbdcf99}"
#define CLSID_PropertyStore "{e4796550-df61-448b-9193-13fc1341b163}"
#usecom IPropertyStore IID_IPropertyStore CLSID_PropertyStore
#comfunc IPropertyStore_SetValue 6 sptr, sptr
#comfunc IPropertyStore_Commit 7
#deffunc CreateShortcut str file_path, str arg, str icon_path, int icon_idx, str out_path, \
local pShellLink, \
local pPropStore, \
local wstring, \
local wstrings, \
local ppropvar, \
local hr
hr = 0
pShellLink = 0
pPropStore = 0
newcom pShellLink, IShellLink
if varuse(pShellLink) == 0 : return -1
IShellLink_SetPath pShellLink, file_path : hr = stat
if SUCCEEDED(hr){
IShellLink_SetArguments pShellLink, arg : hr = stat
if SUCCEEDED(hr){
IShellLink_SetIconLocation pShellLink, icon_path, icon_idx : hr = stat
if SUCCEEDED(hr){
querycom pPropStore, pShellLink, IPropertyStore
if varuse(pPropStore){
IPropertyStore_Commit pPropStore : hr = stat
if SUCCEEDED(hr){
IPersistFile_Save pShellLink, out_path, 1 : hr = stat
}
}
}
}
}
// SafeRelease
SafeRelease pPropStore
SafeRelease pShellLink
return hr
#global
// CreateShortcut
// 第1引数 - ショートカットにしたいパス
// 第2引数 - 引数
// 第3引数 - アイコン情報が格納されているファイル
// 第4引数 - アイコンID(通常は0でOK)
// 第5引数 - ショートカット保存先パス
CreateShortcut "cmd.exe", "/c ping localhost", "cmd.exe", 0, "output.lnk"