|
|
/*++
Copyright (C) 1996-1999 Microsoft Corporation
Module Name:
bstrutil.cpp
Abstract:
B string utility functions.
--*/
#include "ole2.h"
#include "bstrutil.h"
INT SysStringAnsiLen ( IN BSTR bstr ) { if (bstr == NULL) return 0;
#ifndef OLE2ANSI
return WideCharToMultiByte(CP_ACP, 0, bstr, SysStringLen(bstr), NULL, 0, NULL, NULL); #else
return SysStringLen(bstr); #endif
}
HRESULT BStrToStream ( IN LPSTREAM pIStream, IN INT nMbChar, IN BSTR bstr ) { LPSTR pchBuf; HRESULT hr;
// If empty string just return
if (SysStringLen(bstr) == 0) return NO_ERROR;
#ifndef OLE2ANSI
// Convert to multibyte string
pchBuf = new char[nMbChar + 1]; if (pchBuf == NULL) return E_OUTOFMEMORY;
WideCharToMultiByte(CP_ACP, 0, bstr, SysStringLen(bstr), pchBuf, nMbChar+1, NULL, NULL); // Write string to stream
hr = pIStream->Write(pchBuf, nMbChar, NULL);
delete [] pchBuf; #else
hr = pIStream->Write(bstr, nMbChar, NULL); #endif
return hr; }
HRESULT BStrFromStream ( IN LPSTREAM pIStream, IN INT nChar, OUT BSTR *pbstrRet ) { HRESULT hr; BSTR bstr; ULONG nRead; LPSTR pchBuf; INT nWChar;
*pbstrRet = NULL;
// if zero-length string just return
if (nChar == 0) return NO_ERROR;
#ifndef OLE2ANSI
// Allocate char array and read in string
pchBuf = new char[nChar]; if (pchBuf == NULL) return E_OUTOFMEMORY; hr = pIStream->Read(pchBuf, nChar, &nRead); // Verify read count
if (!FAILED(hr)) { if (nRead != (ULONG)nChar) hr = E_FAIL; } if (!FAILED(hr)) { // Allocate BString for UNICODE translation
nWChar = MultiByteToWideChar(CP_ACP, 0, pchBuf, nChar, NULL, 0); bstr = SysAllocStringLen(NULL, nWChar);
if (bstr != NULL) { MultiByteToWideChar(CP_ACP, 0, pchBuf, nChar, bstr, nWChar); bstr[nWChar] = 0; *pbstrRet = bstr; } else hr = E_OUTOFMEMORY; }
delete [] pchBuf; #else
// Allocate BString
bstr = SysAllocStringLen(NULL, nChar); if (bstr == NULL) return E_OUTOFMEMORY;
// Read in string
hr = pIStream->Read(bstr, nChar, &nRead);
// Verify read count
if (!FAILED(hr)) { if (nRead != (ULONG)nChar) hr = E_FAIL; }
// Return or free string
if (!FAILED(hr)) *pbstrRet = bstr; else SysFreeString(bstr); #endif
return hr; }
|