#include "pch.h"
#include "..\Inc\TCLib.h"
#include "RelPath.h"
#include "StrManip.h"
bool TCMakeRelativePath(LPCTSTR pszPath, LPCTSTR pszFrom, LPTSTR pszDest,
int cchMaxDest, bool bBeginWithDot)
{
TCHAR szPathCopy[_MAX_PATH], szFromCopy[_MAX_PATH];
if (!_tfullpath(szPathCopy, pszPath, sizeofArray(szPathCopy)))
return false;
if (!_tfullpath(szFromCopy, pszFrom, sizeofArray(szFromCopy)))
return false;
TCReplaceText(szPathCopy, TEXT("/"), TEXT("\\"), szPathCopy, -1);
TCReplaceText(szFromCopy, TEXT("/"), TEXT("\\"), szFromCopy, -1);
if (TEXT('\\') != szFromCopy[_tcslen(szFromCopy) - 1])
_tcscat(szFromCopy, TEXT("\\"));
HRESULT hr;
IBindCtxPtr pbc;
IMonikerPtr pmkFrom, pmkPath, pmkRelative;
LPOLESTR pszRelative = NULL;
if (SUCCEEDED(hr = CreateFileMoniker(_bstr_t(szFromCopy), &pmkFrom))
&& SUCCEEDED(hr = CreateFileMoniker(_bstr_t(szPathCopy), &pmkPath))
&& S_OK == (hr = pmkFrom->RelativePathTo(pmkPath, &pmkRelative))
&& SUCCEEDED(hr = CreateBindCtx(0, &pbc))
&& SUCCEEDED(hr = pmkRelative->GetDisplayName(pbc, NULL, &pszRelative)))
{
if (bBeginWithDot)
{
TC_tcscpyn(pszDest, TEXT(".\\"), cchMaxDest);
cchMaxDest -= 2;
pszDest += 2;
}
TC_tcscpyn(pszDest, _bstr_t(pszRelative), cchMaxDest);
CoTaskMemFree(pszRelative);
return true;
}
TC_tcscpyn(pszDest, szPathCopy, cchMaxDest);
return false;
}