?
Returnwert vs. exception ist ja immer ein Thema, aber im Erfolgsfall eine Ausnahme zu werfen eher die Seltenheit (zumal in dem Beispiel die Ressourcen nicht freigegeben werden können).
Falls es irgendwen doch interessieren sollte:
#include <shobjidl.h>
#include <shlguid.h>
#include <atlbase.h>
HRESULT ResolveLnk(HWND hwnd, const TCHAR* lnkFile, TCHAR* path, size_t pathLen)
{
*path = 0;
CComPtr<IShellLink> psl;
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast<void**>(&psl));
if (SUCCEEDED(hres))
{
CComPtr<IPersistFile> ppf;
hres = psl->QueryInterface(IID_IPersistFile, reinterpret_cast<void**>(&ppf));
if (SUCCEEDED(hres))
{
# ifdef UNICODE
const WCHAR* wsz = lnkFile;
# else
WCHAR wsz[MAX_PATH];
if(!MultiByteToWideChar(CP_ACP, 0, lnkFile, -1, wsz, MAX_PATH))
{
// hier sollte reagiert werden...
}
# endif
hres = ppf->Load(wsz, STGM_READ);
if (SUCCEEDED(hres))
{
hres = psl->Resolve(hwnd, 0);
if (SUCCEEDED(hres))
{
hres = psl->GetPath(path, pathLen, nullptr, 0);
}
}
}
}
return hres;
}