解决快捷方式

【勇芳软件工作室】汉化HomePreviousNext

应用程序可能需要访问和操作先前创建的快捷方式。此操作称为“解析”快捷方式。

以下示例中的应用程序定义的ResolveIt函数解决了一个快捷方式。其参数包括窗口句柄,指向快捷方式路径的指针以及接收对象的新路径的缓冲区的地址。窗口句柄标识shell可能需要显示的任何消息框的父窗口。例如,如果链接位于非共享介质上,如果发生网络问题,如果用户需要插入软盘,则shell可以显示一个消息框,等等。

ResolveIt函数调用CoCreateInstance函数,并假设CoInitialize函数已被调用。请注意,ResolveIt需要使用IPersistFile界面来存储链接信息。IPersistFileIShellLink对象实现。必须在检索路径信息之前加载链接信息,这在后面的例子中发生。无法加载链接信息会导致对IShellLink::GetPathIShellLink::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;

}