windows-nt/Source/XPSP1/NT/shell/shell32/ole2dup2.c
2020-09-26 16:20:57 +08:00

81 lines
1.9 KiB
C

#include "shellprv.h"
#pragma hdrstop
// NOTE: the STRRET_WSTR pOleStr gets freed, so don't try to use it later
STDAPI_(BOOL) StrRetToStrN(LPTSTR pszOut, UINT cchOut, STRRET *pStrRet, LPCITEMIDLIST pidl)
{
return SUCCEEDED(StrRetToBuf(pStrRet, pidl, pszOut, cchOut));
}
STDAPI_(int) OleStrToStrN(LPTSTR pszOut, int cchOut, LPCWSTR pwsz, int cchWideChar)
{
int cchOutput;
#ifdef UNICODE
VDATEINPUTBUF(pszOut, WCHAR, cchOut);
if (cchOut > cchWideChar && -1 != cchWideChar)
cchOut = cchWideChar;
cchOutput = cchOut;
while (cchOut)
{
if ((*pszOut++ = *pwsz++) == 0)
return cchOutput - cchOut + 1;
cchOut--;
}
if (-1 == cchWideChar)
pszOut--; // Make room for the null
*pszOut = 0;
return cchOutput;
#else
VDATEINPUTBUF(pszOut, CHAR, cchOut);
cchOutput = WideCharToMultiByte(CP_ACP, 0, pwsz, cchWideChar, pszOut, cchOut, NULL, NULL);
if (cchOutput && (cchOutput == cchOut))
cchOutput--;
pszOut[cchOutput] = 0;
return cchOutput;
#endif // UNICODE
}
STDAPI_(int) StrToOleStrN(LPWSTR pwszOut, int cchOut, LPCTSTR psz, int cchIn)
{
int cchOutput;
#ifdef UNICODE
VDATEINPUTBUF(pwszOut, WCHAR, cchOut);
if (cchOut > cchIn)
cchOut = cchIn;
cchOutput = cchOut;
while (--cchOut)
{
if ((*pwszOut++ = *psz++) == 0)
return cchOutput - cchOut + 1;
}
*pwszOut = 0;
return cchOutput;
#else
VDATEINPUTBUF(pwszOut, WCHAR, cchOut);
cchOutput = MultiByteToWideChar(CP_ACP, 0, psz, cchIn, pwszOut, cchOut);
if (cchOutput && (cchOutput == cchOut))
cchOutput--;
pwszOut[cchOutput] = 0;
return cchOutput;
#endif
}
// bogus export, too scared to remove it
STDAPI_(int) StrToOleStr(LPWSTR pwszOut, LPCTSTR psz)
{
VDATEINPUTBUF(pwszOut, WCHAR, MAX_PATH);
return SHTCharToUnicode(psz, pwszOut, MAX_PATH);
}