应用程序可能需要访问和操作先前创建的快捷方式。此操作称为“解析”快捷方式。
以下示例中的应用程序定义的ResolveIt函数解决了一个快捷方式。其参数包括窗口句柄,指向快捷方式路径的指针以及接收对象的新路径的缓冲区的地址。窗口句柄标识shell可能需要显示的任何消息框的父窗口。例如,如果链接位于非共享介质上,如果发生网络问题,如果用户需要插入软盘,则shell可以显示一个消息框,等等。
ResolveIt函数调用CoCreateInstance函数,并假设CoInitialize函数已被调用。请注意,ResolveIt需要使用IPersistFile界面来存储链接信息。IPersistFile由IShellLink对象实现。必须在检索路径信息之前加载链接信息,这在后面的例子中发生。无法加载链接信息会导致对IShellLink::GetPath和IShellLink::GetDescription成员函数的调用失败。
HRESULT ResolveIt(HWND hwnd,LPCSTR lpszLinkFile,LPSTR lpszPath)
{
HRESULT hres;
IShellLink* psl;
char szGotPath[MAX_PATH];
char szDescription[MAX_PATH];
WIN32_FIND_DATA wfd;
*lpszPath = 0; //假设失败
//获取指向IShellLink界面的指针。
hres = CoCreateInstance(&CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, &IID_IShellLink, &psl);
if(SUCCEEDED(hres)){
IPersistFile* ppf;
//获取指向IPersistFile界面的指针。
hres = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile,
&ppf);
if(SUCCEEDED(hres)){
WORD wsz[MAX_PATH];
//确保字符串是Unicode。
的MultiByteToWideChar(CP_ACP 0,lpszLinkFile,-1,WSZ,
MAX_PATH);
//加载快捷方式。
hres = ppf->lpVtbl->Load(ppf, wsz, STGM_READ);
if(SUCCEEDED(hres)){
//解决链接。
hres = psl->lpVtbl->Resolve(psl, hwnd, SLR_ANY_MATCH);
if(SUCCEEDED(hres)){
//获取链接目标的路径。
hres = psl->lpVtbl->GetPath(psl, szGotPath,
MAX_PATH,(WIN32_FIND_DATA *)& wfd,
SLGP_SHORTPATH );
如果(!SUCCEEDED(hres)
HandleErr(hres); //应用程序定义的函数
//获取目标的描述。
hres = psl->lpVtbl->GetDescription(psl,
szDescription, MAX_PATH);
if(!SUCCEEDED(hres))
HandleErr(hres);
lstrcpy(lpszPath, szGotPath);
}
}
//释放指向IPersistFile界面的指针。
ppf->lpVtbl->Release(ppf);
}
//释放指向IShellLink界面的指针。
psl->lpVtbl->Release(psl);
}
return hres;
}