2025-04-27 07:49:33 -04:00

78 lines
1.3 KiB
C++

/*
** WCSOLE.CPP
**
** OLE-requiring bits of wcsutil
*/
#pragma warning(disable: 4237) // disable "bool" reserved
#include "wcsutil.h"
LPSTR
_SzFromVariant(VARIANT *pvar)
{
LPSTR sz = NULL;
OLECHAR *pwch;
DWORD cch, cb;
BOOL fFree;
BSTR bstr;
if (!(bstr = _BstrFromVariant(pvar, &fFree)))
return(NULL);
for (pwch = bstr, cch = 0; *pwch; ++pwch, ++cch)
/* nothing */ ;
cb = (cch + 1) * 2;
if (sz = (LPSTR) _MsnAlloc(cb))
::WideCharToMultiByte(CP_ACP, 0, bstr, -1, sz, cb, NULL, NULL);
if (fFree)
::SysFreeString(bstr);
return(sz);
}
BSTR
_BstrFromVariant(VARIANT *pvar, BOOL *pfFree)
{
VARIANT varTemp;
if (pvar->vt == VT_BSTR)
{
*pfFree = FALSE;
return(V_BSTR(pvar));
}
else
{
::VariantInit(&varTemp);
if (FAILED(::VariantChangeType(&varTemp, pvar, 0, VT_BSTR)))
{
::VariantClear(&varTemp);
return(NULL);
}
*pfFree = TRUE;
return(V_BSTR(&varTemp));
}
}
BOOL
_FIntFromVariant(VARIANT *pvar, int *pi)
{
VARIANT varTemp;
varTemp.vt = VT_I4;
if (pvar->vt == VT_I4)
{
*pi = (int)V_I4(pvar);
return TRUE;
}
if (FAILED(::VariantChangeType(&varTemp, pvar, 0, VT_I4)))
return FALSE;
*pi = V_I4(&varTemp);
return TRUE;
}