windows-nt/Source/XPSP1/NT/com/rpc/runtime/charconv/charconv.cxx
2020-09-26 16:20:57 +08:00

71 lines
1.8 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: charconv.cxx
//
//--------------------------------------------------------------------------
#include <precomp.hxx>
#include "Charconv.hxx"
RPC_STATUS A2WAttachHelper(char *pszAnsi, WCHAR **ppUnicode)
{
int nAnsiLength;
ASSERT(pszAnsi != NULL);
nAnsiLength = lstrlenA(pszAnsi) + 1;
*ppUnicode = new WCHAR[nAnsiLength];
if (*ppUnicode == NULL)
return(RPC_S_OUT_OF_MEMORY);
RtlMultiByteToUnicodeN(*ppUnicode, nAnsiLength * 2, NULL, pszAnsi, nAnsiLength);
return(RPC_S_OK);
}
RPC_STATUS W2AAttachHelper(WCHAR *pUnicode, char **ppAnsi)
{
int nUnicodeLength;
ASSERT(pUnicode != NULL);
NTSTATUS status;
status = RtlUnicodeToMultiByteSize((unsigned long *)&nUnicodeLength,
pUnicode, lstrlenW(pUnicode) * 2);
if (status)
return RPC_S_INVALID_ARG;
nUnicodeLength ++;
*ppAnsi = new char[nUnicodeLength];
if (*ppAnsi == NULL)
return(RPC_S_OUT_OF_MEMORY);
RtlUnicodeToMultiByteN(*ppAnsi, nUnicodeLength, NULL, pUnicode, nUnicodeLength * 2);
return(RPC_S_OK);
}
RPC_STATUS CHeapUnicode::Attach(char *pszAnsi)
{
ANSI_STRING AnsiString;
NTSTATUS NtStatus;
RtlInitAnsiString(&AnsiString, (PSZ)pszAnsi);
NtStatus = RtlAnsiStringToUnicodeString(&m_UnicodeString, &AnsiString, TRUE);
if (!NT_SUCCESS(NtStatus))
return(RPC_S_OUT_OF_MEMORY);
return(RPC_S_OK);
}
RPC_STATUS CHeapAnsi::Attach(WCHAR *pszUnicode)
{
UNICODE_STRING UnicodeString;
NTSTATUS NtStatus;
RtlInitUnicodeString(&UnicodeString, pszUnicode);
NtStatus = RtlUnicodeStringToAnsiString(&m_AnsiString, &UnicodeString, TRUE);
if (!NT_SUCCESS(NtStatus))
return(RPC_S_OUT_OF_MEMORY);
return(RPC_S_OK);
}