static IShellLinkW *load_shelllink( const WCHAR *path ) { HRESULT hr; IShellLinkW *link; IPersistFile *file; hr = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void **)&link ); if (FAILED( hr )) return NULL; hr = IShellLinkW_QueryInterface( link, &IID_IPersistFile, (void **)&file ); if (FAILED( hr )) { IShellLinkW_Release( link ); return NULL; } hr = IPersistFile_Load( file, path, 0 ); IPersistFile_Release( file ); if (FAILED( hr )) { IShellLinkW_Release( link ); return NULL; } return link; }
VOID SetupCreateLink( _In_ PWSTR LinkFilePath, _In_ PWSTR FilePath, _In_ PWSTR FileParentDir ) { IShellLink* shellLinkPtr = NULL; IPersistFile* persistFilePtr = NULL; if (FAILED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, &shellLinkPtr))) goto CleanupExit; if (FAILED(IShellLinkW_QueryInterface(shellLinkPtr, &IID_IPersistFile, &persistFilePtr))) goto CleanupExit; // Load existing shell item if it exists... //IPersistFile_Load(persistFilePtr, LinkFilePath, STGM_READ) //IShellLinkW_SetDescription(shellLinkPtr, FileComment); IShellLinkW_SetWorkingDirectory(shellLinkPtr, FileParentDir); IShellLinkW_SetIconLocation(shellLinkPtr, FilePath, 0); // Set the shortcut target path... if (FAILED(IShellLinkW_SetPath(shellLinkPtr, FilePath))) goto CleanupExit; // Save the shortcut to the file system... IPersistFile_Save(persistFilePtr, LinkFilePath, TRUE); CleanupExit: if (persistFilePtr) IPersistFile_Release(persistFilePtr); if (shellLinkPtr) IShellLinkW_Release(shellLinkPtr); }
BOOLEAN CreateLink( _In_ PWSTR DestFilePath, _In_ PWSTR FilePath, _In_ PWSTR FileParentDir, _In_ PWSTR FileComment ) { IShellLink* shellLinkPtr = NULL; IPersistFile* persistFilePtr = NULL; BOOLEAN isSuccess = FALSE; __try { if (FAILED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, &shellLinkPtr))) __leave; if (FAILED(IShellLinkW_QueryInterface(shellLinkPtr, &IID_IPersistFile, &persistFilePtr))) __leave; // Load existing shell item if it exists... //if (SUCCEEDED(IPersistFile_Load(persistFilePtr, DestFilePath, STGM_READ))) //{ // IShellLinkW_Resolve(shellLinkPtr, NULL, 0); //} IShellLinkW_SetDescription(shellLinkPtr, FileComment); IShellLinkW_SetWorkingDirectory(shellLinkPtr, FileParentDir); IShellLinkW_SetIconLocation(shellLinkPtr, FilePath, 0); // Set the shortcut target path... if (FAILED(IShellLinkW_SetPath(shellLinkPtr, FilePath))) __leave; // Save the shortcut to the file system... if (FAILED(IPersistFile_Save(persistFilePtr, DestFilePath, TRUE))) __leave; isSuccess = TRUE; } __finally { if (persistFilePtr) { IPersistFile_Release(persistFilePtr); } if (shellLinkPtr) { IShellLinkW_Release(shellLinkPtr); } } return isSuccess; }
static HRESULT WINAPI WshShortcut_Save(IWshShortcut *iface) { WshShortcut *This = impl_from_IWshShortcut(iface); IPersistFile *file; HRESULT hr; TRACE("(%p)\n", This); IShellLinkW_QueryInterface(This->link, &IID_IPersistFile, (void**)&file); hr = IPersistFile_Save(file, This->path_link, TRUE); IPersistFile_Release(file); return hr; }