WCHAR *ResolveLnk(const WCHAR * path) { ScopedMem<OLECHAR> olePath(str::Dup(path)); if (!olePath) return NULL; ScopedComPtr<IShellLink> lnk; HRESULT hRes = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&lnk); if (FAILED(hRes)) return NULL; ScopedComQIPtr<IPersistFile> file(lnk); if (!file) return NULL; hRes = file->Load(olePath, STGM_READ); if (FAILED(hRes)) return NULL; hRes = lnk->Resolve(NULL, SLR_UPDATE); if (FAILED(hRes)) return NULL; WCHAR newPath[MAX_PATH]; hRes = lnk->GetPath(newPath, MAX_PATH, NULL, 0); if (FAILED(hRes)) return NULL; return str::Dup(newPath); }