if (!pSrc) return NULL;
- /* Compute the needed size without the NULL terminator */
+ /* Compute the needed size with the NULL terminator */
cwch = ::MultiByteToWideChar(CP_ACP /* CP_UTF8 */, 0, pSrc, -1, NULL, 0);
if (cwch == 0) return NULL;
- cwch--;
- /* Allocate the BSTR */
- wsOut = ::SysAllocStringLen(NULL, cwch);
+ /* Allocate the BSTR (without the NULL terminator) */
+ wsOut = ::SysAllocStringLen(NULL, cwch - 1);
if (!wsOut)
{
::_com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY));
if (!pSrc) return NULL;
- /* Retrieve the size of the BSTR without the NULL terminator */
- cwch = ::SysStringLen(pSrc);
+ /* Retrieve the size of the BSTR with the NULL terminator */
+ cwch = ::SysStringLen(pSrc) + 1;
/* Compute the needed size with the NULL terminator */
- cb = ::WideCharToMultiByte(CP_ACP /* CP_UTF8 */, 0, pSrc, cwch + 1, NULL, 0, NULL, NULL);
+ cb = ::WideCharToMultiByte(CP_ACP /* CP_UTF8 */, 0, pSrc, cwch, NULL, 0, NULL, NULL);
if (cb == 0)
{
cwch = ::GetLastError();
}
/* Convert the string and NULL-terminate */
- szOut[cb - 1] = '\0';
- if (::WideCharToMultiByte(CP_ACP /* CP_UTF8 */, 0, pSrc, cwch + 1, szOut, cb, NULL, NULL) == 0)
+ szOut[cb - 1] = '\0';
+ if (::WideCharToMultiByte(CP_ACP /* CP_UTF8 */, 0, pSrc, cwch, szOut, cb, NULL, NULL) == 0)
{
/* We failed, clean everything up */
cwch = ::GetLastError();