78 lines
1.3 KiB
C++
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;
|
|
}
|
|
|