#include "femgrate.h" #include #include #include #include HRESULT FixPathInLink(LPCTSTR pszShortcutFile, LPCTSTR lpszOldSubStr,LPCTSTR lpszNewSubStr) { HRESULT hres; IShellLink *psl; TCHAR szGotPath [MAX_PATH]; TCHAR szNewPath [MAX_PATH]; WIN32_FIND_DATA wfd; CoInitialize(NULL); // Get a pointer to the IShellLink interface. hres = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl); if (SUCCEEDED (hres)) { IPersistFile *ppf; // Get a pointer to the IPersistFile interface. hres = psl->QueryInterface (IID_IPersistFile, (void **)&ppf); if (SUCCEEDED (hres)) { // Load the shortcut. hres = ppf->Load (pszShortcutFile, STGM_READWRITE ); if (SUCCEEDED (hres)) { // Resolve the shortcut. hres = psl->Resolve (NULL, SLR_NO_UI | SLR_UPDATE); if (SUCCEEDED (hres)) { lstrcpy (szGotPath, pszShortcutFile); // Get the path to the shortcut target. hres = psl->GetPath (szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd, SLGP_SHORTPATH); if (! SUCCEEDED (hres)) { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: GetPath %s Error = %d\n"), szGotPath,hres)); } else { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: GetPath %s OK \n"), szGotPath)); } if (ReplaceString(szGotPath,lpszOldSubStr, lpszNewSubStr, szNewPath)) { hres = psl->SetPath (szNewPath); if (! SUCCEEDED (hres)) { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: SetPath %s Error = %d\n"), szGotPath,hres)); } else { hres = ppf->Save (pszShortcutFile,TRUE); if (! SUCCEEDED (hres)) { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: Save %s Error = %d\n"), pszShortcutFile,hres)); } else { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: Save %s OK = %d\n"), pszShortcutFile,hres)); } } } else { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: No match ! %s , %s, %s = %d\n"), szGotPath,lpszOldSubStr, lpszNewSubStr)); } } } else { DebugMsg((DM_VERBOSE, TEXT("FixPathInLink: Load %s Error = %d\n"), pszShortcutFile,hres)); } // Release the pointer to IPersistFile. ppf->Release (); } // Release the pointer to IShellLink. psl->Release (); } CoUninitialize(); return hres; }