From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- .../openmpt-trunk/mptrack/LinkResolver.cpp | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Src/external_dependencies/openmpt-trunk/mptrack/LinkResolver.cpp (limited to 'Src/external_dependencies/openmpt-trunk/mptrack/LinkResolver.cpp') diff --git a/Src/external_dependencies/openmpt-trunk/mptrack/LinkResolver.cpp b/Src/external_dependencies/openmpt-trunk/mptrack/LinkResolver.cpp new file mode 100644 index 00000000..af74514e --- /dev/null +++ b/Src/external_dependencies/openmpt-trunk/mptrack/LinkResolver.cpp @@ -0,0 +1,62 @@ +/* + * LinkResolver.cpp + * ---------------- + * Purpose: Resolve Windows shell link targets + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "LinkResolver.h" + +#include + +OPENMPT_NAMESPACE_BEGIN + +LinkResolver::LinkResolver() +{ + HRESULT result = CoCreateInstance(CLSID_ShellLink, + 0, + CLSCTX_INPROC_SERVER, + IID_IShellLink, + reinterpret_cast(&psl)); + if(SUCCEEDED(result) && psl != nullptr) + { + psl->QueryInterface(IID_IPersistFile, reinterpret_cast(&ppf)); + } +} + +LinkResolver::~LinkResolver() +{ + if(ppf != nullptr) + ppf->Release(); + if(psl != nullptr) + psl->Release(); +} + +mpt::PathString LinkResolver::Resolve(const TCHAR *inPath) +{ + if(ppf == nullptr) + return {}; + + SHFILEINFO info; + Clear(info); + if((SHGetFileInfo(inPath, 0, &info, sizeof(info), SHGFI_ATTRIBUTES) == 0) || !(info.dwAttributes & SFGAO_LINK)) + return {}; + + USES_CONVERSION; // T2COLE needs this + if(ppf != nullptr && SUCCEEDED(ppf->Load(T2COLE(inPath), STGM_READ))) + { + if(SUCCEEDED(psl->Resolve(AfxGetMainWnd()->m_hWnd, MAKELONG(SLR_ANY_MATCH | SLR_NO_UI | SLR_NOSEARCH, 100)))) + { + TCHAR outPath[MAX_PATH]; + psl->GetPath(outPath, mpt::saturate_cast(std::size(outPath)), nullptr, 0); + return mpt::PathString::FromNative(outPath); + } + } + return {}; +} + +OPENMPT_NAMESPACE_END -- cgit