debugcppCritical
Resolving a link
Viewed 0 times
linkresolvingstackoverflow
Problem
How can I clean this up?
std::wstring LinkResolve::ResolveLink( const std::wstring& source ) const
{
HRESULT errorCheck;
wchar_t linkTarget[MAX_PATH];
wchar_t expandedTarget[MAX_PATH];
wchar_t arguments[INFOTIPSIZE];
ATL::CComPtr ipf;
errorCheck = ipf.CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER);
if (!SUCCEEDED(errorCheck))
{
throw _com_error(errorCheck);
}
errorCheck = ipf->Load(source.c_str(), 0);
ATL::CComPtr shellLink;
errorCheck = ipf->QueryInterface(&shellLink);
if (!SUCCEEDED(errorCheck))
{
throw _com_error(errorCheck);
}
errorCheck = shellLink->Resolve(0, SLR_NO_UI);
if (!SUCCEEDED(errorCheck))
{
throw _com_error(errorCheck);
}
errorCheck = shellLink->GetPath(linkTarget, MAX_PATH, 0, SLGP_RAWPATH);
if (!SUCCEEDED(errorCheck))
{
throw _com_error(errorCheck);
}
ExpandEnvironmentStringsW(linkTarget, expandedTarget, MAX_PATH);
errorCheck = shellLink->GetArguments(arguments, INFOTIPSIZE);
if (SUCCEEDED(errorCheck))
{
return std::wstring(expandedTarget) + L" " + arguments;
}
else
{
return expandedTarget;
}
}Solution
Personally, I'd write a simple function:
Then the function calls become:
Incidentally, you missed a check for
void ThrowOnFail( HRESULT hrcode )
{
if (FAILED(hrcode))
throw _com_error(hrcode);
}Then the function calls become:
ThrowOnFail( ipf.CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER) );
ThrowOnFail( ipf->Load(source.c_str(), 0) );
ATL::CComPtr shellLink;
ThrowOnFail( ipf->QueryInterface(&shellLink) );
ThrowOnFail( shellLink->Resolve(0, SLR_NO_UI) );
ThrowOnFail( shellLink->GetPath(linkTarget, MAX_PATH, 0, SLGP_RAWPATH) );Incidentally, you missed a check for
errorCheck after Load. This becomes easier to spot with a check function.Code Snippets
void ThrowOnFail( HRESULT hrcode )
{
if (FAILED(hrcode))
throw _com_error(hrcode);
}ThrowOnFail( ipf.CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER) );
ThrowOnFail( ipf->Load(source.c_str(), 0) );
ATL::CComPtr<IShellLink> shellLink;
ThrowOnFail( ipf->QueryInterface(&shellLink) );
ThrowOnFail( shellLink->Resolve(0, SLR_NO_UI) );
ThrowOnFail( shellLink->GetPath(linkTarget, MAX_PATH, 0, SLGP_RAWPATH) );Context
StackExchange Code Review Q#259, answer score: 56
Revisions (0)
No revisions yet.