📄 w32win32.cpp
字号:
if (HIWORD(pstr) == 0)
{
_pwstr = (LPWSTR) pstr;
return;
}
Assert(cch == -1 || cch > 0);
//
// Convert string to preallocated buffer, and return if successful.
//
_cwchLen = MultiByteToWideChar(
uiCodePage, 0, pstr, cch, _awch, ARRAY_SIZE(_awch));
if (_cwchLen > 0)
{
if(_awch[_cwchLen-1] == 0)
_cwchLen--; // account for terminator
_pwstr = _awch;
return;
}
//
// Alloc space on heap for buffer.
//
TRACEINFOSZ("CStrInW: Allocating buffer for wrapped function argument.");
cchBufReq = MultiByteToWideChar(
CP_ACP, 0, pstr, cch, NULL, 0);
Assert(cchBufReq > 0);
_pwstr = new WCHAR[cchBufReq];
if (!_pwstr)
{
// On failure, the argument will point to the empty string.
TRACEINFOSZ("CStrInW: No heap space for wrapped function argument.");
_awch[0] = 0;
_pwstr = _awch;
return;
}
Assert(HIWORD(_pwstr));
_cwchLen = -1 + MultiByteToWideChar(
uiCodePage, 0, pstr, cch, _pwstr, cchBufReq);
Assert(_cwchLen >= 0);
}
//+---------------------------------------------------------------------------
//
// Member: CStrOutW::CStrOutW
//
// Synopsis: Allocates enough space for an out buffer.
//
// Arguments: [pstr] -- The ansi buffer to convert to when destroyed.
// May be NULL.
//
// [cchBuf] -- The size of the buffer in characters.
//
// Modifies: [this].
//
//----------------------------------------------------------------------------
CStrOutW::CStrOutW(LPSTR pstr, int cchBuf, UINT uiCodePage)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CStrOutW::CStrOutW");
Assert(cchBuf >= 0);
_pstr = pstr;
_cchBuf = cchBuf;
_uiCodePage = uiCodePage;
if (!pstr)
{
Assert(cchBuf == 0);
_pwstr = NULL;
return;
}
Assert(HIWORD(pstr));
// Initialize buffer in case Windows API returns an error.
_awch[0] = 0;
// Use preallocated buffer if big enough.
if (cchBuf <= ARRAY_SIZE(_awch))
{
_pwstr = _awch;
return;
}
// Allocate buffer.
TRACEINFOSZ("CStrOutW: Allocating buffer for wrapped function argument.");
_pwstr = new WCHAR[cchBuf * 2];
if (!_pwstr)
{
//
// On failure, the argument will point to a zero-sized buffer initialized
// to the empty string. This should cause the Windows API to fail.
//
TRACEINFOSZ("CStrOutW: No heap space for wrapped function argument.");
Assert(cchBuf > 0);
_pstr[0] = 0;
_cchBuf = 0;
_pwstr = _awch;
return;
}
Assert(HIWORD(_pwstr));
_pwstr[0] = 0;
}
//+---------------------------------------------------------------------------
//
// Member: CStrOutW::Convert
//
// Synopsis: Converts the buffer from Unicode to MBCS
//
//----------------------------------------------------------------------------
int
CStrOutW::Convert()
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CStrOutW::Convert");
int cch;
if (!_pwstr)
return 0;
WCHAR *pwstr = _pwstr;
int cchBuf = _cchBuf;
cch = W32->MbcsFromUnicode(_pstr, cchBuf, _pwstr, -1, _uiCodePage);
Free();
return cch - 1;
}
//+---------------------------------------------------------------------------
//
// Member: CStrOutW::~CStrOutW
//
// Synopsis: Converts the buffer from Unicode to MBCS.
//
// Note: Don't inline this function, or you'll increase code size as
// both Convert() and CConvertStr::~CConvertStr will be called
// inline.
//
//----------------------------------------------------------------------------
CStrOutW::~CStrOutW()
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CStrOutW::~CStrOutW");
Convert();
}
BOOL CW32System::GetVersion(
DWORD *pdwPlatformId,
DWORD *pdwMajorVersion
)
{
OSVERSIONINFOA osv;
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
*pdwPlatformId = 0;
*pdwMajorVersion = 0;
if (::GetVersionExA(&osv))
{
*pdwPlatformId = osv.dwPlatformId;
*pdwMajorVersion = osv.dwMajorVersion;
return TRUE;
}
return FALSE;
}
BOOL WINAPI CW32System::GetStringTypeEx(
LCID lcid,
DWORD dwInfoType,
LPCTSTR lpSrcStr,
int cchSrc,
LPWORD lpCharType
)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "GetStringTypeEx");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::GetStringTypeExW(lcid, dwInfoType, lpSrcStr, cchSrc, lpCharType);
CStrIn str(lpSrcStr, cchSrc);
return GetStringTypeExA(lcid, dwInfoType, str, str.strlen(), lpCharType);
}
typedef LPSTR (CALLBACK *FnCharChangeCase)(LPSTR);
static LPWSTR CharChangeCase(LPWSTR pwstr, FnCharChangeCase pfn)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CharChangeCaseWrap");
if (HIWORD(pwstr) == 0)
{
LPSTR pstr=0;
int retCode;
char DBChar[3];
retCode = W32->MbcsFromUnicode((LPSTR) &pstr, sizeof(pstr), (LPWSTR) &pwstr, 1);
Assert(HIWORD(pstr) == 0);
if (retCode == 2)
{
// This is a DBC, use string
DWORD iTemp = (int)pstr;
DBChar[0] = iTemp & 0x0ff;
DBChar[1] = iTemp >> 8;
DBChar[2] = 0;
pstr = (*pfn)(DBChar);
W32->UnicodeFromMbcs((LPWSTR) &pwstr, sizeof(pwstr) / sizeof(WCHAR), (LPSTR)DBChar, 2);
}
else
{
pstr = (*pfn)(pstr);
W32->UnicodeFromMbcs((LPWSTR) &pwstr, sizeof(pwstr) / sizeof(WCHAR), (LPSTR) &pstr);
}
Assert(HIWORD(pwstr) == 0);
}
else
{
CStrOut strOut(pwstr, wcslen(pwstr));
W32->MbcsFromUnicode(strOut, strOut.BufSize(), pwstr);
(*pfn)(strOut);
}
return pwstr;
}
LPWSTR WINAPI CW32System::CharLower(LPWSTR pwstr)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CharLower");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CharLowerW(pwstr);
return CharChangeCase(pwstr, CharLowerA);
}
DWORD WINAPI CW32System::CharLowerBuff(LPWSTR pwstr, DWORD cchLength)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CharLowerBuff");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CharLowerBuffW(pwstr, cchLength);
LPWSTR lpBuffer = pwstr;
for (DWORD pos = 0; pos < cchLength; pos++, lpBuffer++)
*lpBuffer = (WCHAR)CharChangeCase((LPWSTR)*lpBuffer, CharLowerA);
return pos;
}
DWORD WINAPI CW32System::CharUpperBuff(LPWSTR pwstr, DWORD cchLength)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CharUpperBuff");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CharUpperBuffW(pwstr, cchLength);
LPWSTR lpBuffer = pwstr;
for (DWORD pos = 0; pos < cchLength; pos++, lpBuffer++)
*lpBuffer = (WCHAR)CharChangeCase((LPWSTR)*lpBuffer, CharUpperA);
return pos;
}
typedef HDC (CALLBACK *FnCreateHDCA)(LPCSTR, LPCSTR, LPCSTR, CONST DEVMODEA *);
static HDC WINAPI CreateHDCAux(
LPCWSTR lpszDriver,
LPCWSTR lpszDevice,
LPCWSTR lpszOutput,
CONST DEVMODEW * lpInitData,
FnCreateHDCA pfn
)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CreateHDCWrap");
DEVMODEA devmode;
CStrIn strDriver(lpszDriver);
CStrIn strDevice(lpszDevice);
CStrIn strOutput(lpszOutput);
if ( lpInitData )
{
// converting DEVMODEW to DEVMODEA
int byteCount;
// copying the data between the two strings members
byteCount = (char *)&(devmode.dmFormName)
- (char *)&(devmode.dmSpecVersion);
memcpy(&(devmode.dmSpecVersion),
&(lpInitData->dmSpecVersion),
byteCount);
// copying the data after the second string member
byteCount = (char *)((char *)&devmode + sizeof(DEVMODEA))
- (char *)&(devmode.dmLogPixels);
memcpy(&(devmode.dmLogPixels),
&(lpInitData->dmLogPixels),
byteCount);
// converting the two strings members
W32->MbcsFromUnicode((CHAR *)devmode.dmDeviceName, CCHDEVICENAME, lpInitData->dmDeviceName);
W32->MbcsFromUnicode((CHAR *)devmode.dmFormName, CCHFORMNAME, lpInitData->dmFormName);
}
return (*pfn)(strDriver, strDevice, strOutput,
lpInitData ? &devmode : NULL);
}
HDC WINAPI CW32System::CreateIC(
LPCWSTR lpszDriver,
LPCWSTR lpszDevice,
LPCWSTR lpszOutput,
CONST DEVMODEW * lpInitData)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CreateIC");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CreateICW( lpszDriver, lpszDevice, lpszOutput, lpInitData );
return CreateHDCAux(lpszDriver, lpszDevice, lpszOutput, lpInitData, CreateICA);
}
HANDLE WINAPI CW32System::CreateFile(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CreateFile");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CreateFileW(lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
CStrIn str(lpFileName);
return ::CreateFileA(
str,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
}
HFONT WINAPI CW32System::CreateFontIndirect(CONST LOGFONTW * plfw)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CreateFontIndirect");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CreateFontIndirectW(plfw);
LOGFONTA lfa;
HFONT hFont;
memcpy(&lfa, plfw, offsetof(LOGFONTA, lfFaceName));
MbcsFromUnicode(lfa.lfFaceName, ARRAY_SIZE(lfa.lfFaceName), plfw->lfFaceName,
-1, CP_ACP, UN_NOOBJECTS);
hFont = ::CreateFontIndirectA(&lfa);
return hFont;
}
int WINAPI CW32System::CompareString (
LCID Locale, // locale identifier
DWORD dwCmpFlags, // comparison-style options
LPCWSTR lpString1, // pointer to first string
int cchCount1, // size, in bytes or characters, of first string
LPCWSTR lpString2, // pointer to second string
int cchCount2 // size, in bytes or characters, of second string
)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "CompareString");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::CompareStringW(Locale, dwCmpFlags, lpString1, cchCount1, lpString2, cchCount2);
CStrIn str1(lpString1, cchCount1);
CStrIn str2(lpString2, cchCount2);
return CompareStringA(
Locale,
dwCmpFlags,
str1,
str1.strlen(),
str2,
str2.strlen()
);
}
LRESULT WINAPI CW32System::DefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "DefWindowProcWrap");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::DefWindowProcW(hWnd, msg, wParam, lParam);
return ::DefWindowProcA(hWnd, msg, wParam, lParam);
}
int WINAPI CW32System::GetObject(HGDIOBJ hgdiObj, int cbBuffer, LPVOID lpvObj)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "GetObject");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::GetObjectW( hgdiObj, cbBuffer, lpvObj);
int nRet;
if(cbBuffer != sizeof(LOGFONTW) || !lpvObj)
{
nRet = ::GetObjectA(hgdiObj, cbBuffer, lpvObj);
if(nRet == sizeof(LOGFONTA))
{
nRet = sizeof(LOGFONTW);
}
}
else
{
LOGFONTA lfa;
nRet = ::GetObjectA(hgdiObj, sizeof(lfa), &lfa);
if(nRet > 0)
{
memcpy(lpvObj, &lfa, offsetof(LOGFONTW, lfFaceName));
UnicodeFromMbcs(((LOGFONTW*)lpvObj)->lfFaceName, ARRAY_SIZE(((LOGFONTW*)lpvObj)->lfFaceName),
lfa.lfFaceName, -1);
nRet = sizeof(LOGFONTW);
}
}
return nRet;
}
DWORD APIENTRY CW32System::GetProfileSection(
LPCWSTR lpAppName,
LPWSTR lpReturnedString,
DWORD nSize
)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "GetProfileSection");
if (VER_PLATFORM_WIN32_WINDOWS != _dwPlatformId)
return ::GetProfileSectionW( lpAppName, lpReturnedString, nSize );
CStrIn strAppName
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -