windows核心编程(二)关于windows的UNICODE的编程相关

//宽字节定义:

typedef unsigned short wchar_t
//字符串连接

char *strcat(char *,const char *);
wchar_t *wcscat(wchar_t *,const wchar_t *);
//比较
char *strcmp(const char *,const char *);
wchar_t *wcscmp(const wchar_t *,const wchar_t *);
//有两个专业级的比较函数,测试只能在vista及以上版本的windows系统上才可使用,如下:

TCHAR strW1[MAX_PATH],strW2[MAX_PATH];
ZeroMemory(strW1,sizeof(strW1));
ZeroMemory(strW2,sizeof(strW2));

LCID lcid = GetThreadLocale();
StringCchCopy(strW1,_countof(strW1),_T("hello"));
StringCchCopy(strW2,_countof(strW2),_T("Hello"));

int ret = CompareString(lcid,0,strW1,_countof(strW1),strW2,_countof(strW2));
if (CSTR_EQUAL == ret)
{
	AfxMessageBox(_T("strW1 = strW2"));

}else if (CSTR_LESS_THAN == ret)
{
	AfxMessageBox(_T("strW1 < strW2"));
}else if (CSTR_GREATER_THAN == ret)
{
	AfxMessageBox(_T("strW1 > strW2"));
}
ret = CompareStringOrdinal(strW1,_countof(strW1),strW2,_countof(strW2),TRUE/*忽略大小写*/);
if (CSTR_EQUAL == ret)
{
	AfxMessageBox(_T("strW1 = strW2"));

}else if (CSTR_LESS_THAN == ret)
{
	AfxMessageBox(_T("strW1 < strW2"));
}else if (CSTR_GREATER_THAN == ret)
{
	AfxMessageBox(_T("strW1 > strW2"));
}

注:lstrcmp/lstrcmpi 是通过调用int CompareString();实现的,与C运行期函数时不一样的。
int CompareString( LCID Locale,//当前线程的地方ID,使用GetThreadLocal()获取
    DWORD dwCmpFlags,//flag 
    LPCTSTR lpString1,//str1
    int cchCount1, //若为-1,则该函数将认为lpString1是以0结尾,并计算该字符串的长度
    LPCTSTR lpString2,//str2
    int cchCount2
);


//数字转为KB或者byte的格式化的函数

	DWORD dwInValue = 102400001;
	TCHAR strW[MAX_PATH];

	ZeroMemory(strW,sizeof(strW));
	StrFormatKBSize(dwInValue,strW,_countof(strW));
	AfxMessageBox(strW);


	ZeroMemory(strW,sizeof(strW));
	StrFormatByteSize(dwInValue,strW,_countof(strW));
	AfxMessageBox(strW);
//取长度

size_t strlen(const char *);
size_t wcslen(const wchar_t *);
//大小写转换

CharLower();
CharUpper();
//判断字符串
IsCharAlpha(TCHAR ch);//大小写字母,返回TRUE
IsCharAlphaNumberic(TCHAR ch);//大小写字符或者数字,返回TRUE
IsCharLower(TCHAR ch);//小写字母返回TRUE
IsCharUpper(TCHAR ch);//大写字母返回TRUE
//sprintf扩充(UNICODE与ANSI转换不推荐使用)
char strA[100];
TCHAR strW[100];
sprintf(szA,"%s","ANSI str"); //ANSI
sprintf(szA,"%S",L"UNOCIDE str"); // UNICODE to ANSI

swprintf(szW,L"%s",L"UNICODE str"); //UNICODE
swprintf(szW,L"%S","ANSI str");// ANSI to UNICODE 
//判断文件是否为UNICODE编码

IsUnicodeText();
//ANSI与UNICODE之间的互转(UNICODE与ANSI转换推荐使用)
WideCharToMultiByte(); //UNICODE to ANSI
MultiByteToWideChar(); //ANSI to UNICODE
//兼容性
#ifdef UNICODE
typedef wchar_t TCHAR
#else
typedef chat TCHAR
#endif
//以下函数为宏,在UNICODE和ANSI下是通用的
//(a)第一组函数。此组函数宏时定义在WinBase.h文件内,是windows自己定义的函数

//WinBase.h文件内一段code
WINBASEAPI
int
WINAPI
lstrcmpA(
    __in LPCSTR lpString1,
    __in LPCSTR lpString2
    );
WINBASEAPI
int
WINAPI
lstrcmpW(
    __in LPCWSTR lpString1,
    __in LPCWSTR lpString2
    );
#ifdef UNICODE
#define lstrcmp  lstrcmpW
#else
#define lstrcmp  lstrcmpA
#endif // !UNICODE

WINBASEAPI
int
WINAPI
lstrcmpiA(
    __in LPCSTR lpString1,
    __in LPCSTR lpString2
    );
WINBASEAPI
int
WINAPI
lstrcmpiW(
    __in LPCWSTR lpString1,
    __in LPCWSTR lpString2
    );
#ifdef UNICODE
#define lstrcmpi  lstrcmpiW
#else
#define lstrcmpi  lstrcmpiA
#endif // !UNICODE

WINBASEAPI
__out
LPSTR
WINAPI
lstrcpynA(
    __out_ecount(iMaxLength) LPSTR lpString1,
    __in LPCSTR lpString2,
    __in int iMaxLength
    );
WINBASEAPI
__out
LPWSTR
WINAPI
lstrcpynW(
    __out_ecount(iMaxLength) LPWSTR lpString1,
    __in LPCWSTR lpString2,
    __in int iMaxLength
    );
#ifdef UNICODE
#define lstrcpyn  lstrcpynW
#else
#define lstrcpyn  lstrcpynA
#endif // !UNICODE

#if defined(DEPRECATE_SUPPORTED)
#pragma warning(push)
#pragma warning(disable:4995)
#endif

WINBASEAPI
__out
LPSTR
WINAPI
lstrcpyA(
    __out LPSTR lpString1,
    __in  LPCSTR lpString2
    );
WINBASEAPI
__out
LPWSTR
WINAPI
lstrcpyW(
    __out LPWSTR lpString1,
    __in  LPCWSTR lpString2
    );
#ifdef UNICODE
#define lstrcpy  lstrcpyW
#else
#define lstrcpy  lstrcpyA
#endif // !UNICODE

WINBASEAPI
__out
LPSTR
WINAPI
lstrcatA(
    __inout LPSTR lpString1,
    __in    LPCSTR lpString2
    );
WINBASEAPI
__out
LPWSTR
WINAPI
lstrcatW(
    __inout LPWSTR lpString1,
    __in    LPCWSTR lpString2
    );
#ifdef UNICODE
#define lstrcat  lstrcatW
#else
#define lstrcat  lstrcatA
#endif // !UNICODE

#if defined(DEPRECATE_SUPPORTED)
#pragma warning(pop)
#endif

WINBASEAPI
int
WINAPI
lstrlenA(
    __in LPCSTR lpString
    );
WINBASEAPI
int
WINAPI
lstrlenW(
    __in LPCWSTR lpString
    );
#ifdef UNICODE
#define lstrlen  lstrlenW
#else
#define lstrlen  lstrlenA
#endif // !UNICODE
//(b)第二组函数。此组函数定义在tchar.h文件内,应该是c++的库文件

#ifdef _UNICODE //tchar.h文件内一段定义code

#define _tcscat         wcscat
#define _tcscat_s       wcscat_s
#define _tcschr         wcschr
#define _tcscpy         wcscpy
#define _tcscpy_s       wcscpy_s
#define _tcscspn        wcscspn
#define _tcslen         wcslen
#define _tcsnlen        wcsnlen
#define _tcsncat        wcsncat
#define _tcsncat_s      wcsncat_s
#define _tcsncat_l      _wcsncat_l
#define _tcsncat_s_l    _wcsncat_s_l
#define _tcsncpy        wcsncpy
#define _tcsncpy_s      wcsncpy_s
#define _tcsncpy_l      _wcsncpy_l
#define _tcsncpy_s_l    _wcsncpy_s_l

#els
#define _tcscat     strcat
#define _tcscat_s   strcat_s
#define _tcscpy     strcpy
#define _tcscpy_s   strcpy_s
#define _tcsdup     _strdup
#define _tcslen     strlen
#define _tcsnlen    strnlen
#define _tcsxfrm    strxfrm
#define _tcsxfrm_l    _strxfrm_l
#define _tcserror   strerror
#define _tcserror_s   strerror_s
#define __tcserror  _strerror
#define __tcserror_s  _strerror_s

#endif

//注:区别说明:
//When your project settings are MBCS(多字节字符集), tcslen and lstrlen are same. You 
//should not use lstrlen on a UNICODE string. _tcslen will work on a 
//UNICODE string as well as MBCS. 
//If you dont know what MBCS/UNICODE are, use _tcslen 
//在windows核心编程书上说lstr系列的函数是kernel32的函数,反正应用开发就是使用_tcslen()比较好(个人认为)
//_tcscpy_s之类的安全性问题
//做安全性检查:指针不为NULL,整数在有效范围内,枚举值是否有效,缓冲区是否足够容纳结果数据
//除了_s之类的安全函数之外,还有一个strsafe.h文件定义的一系列安全函数,这是C运行库的函数,如下:(一段实例code)
#ifdef UNICODE
#define StringCchCopy  StringCchCopyW
#else
#define StringCchCopy  StringCchCopyA
#endif // !UNICODE

STRSAFEAPI
StringCchCopyA(
    __out_ecount(cchDest) STRSAFE_LPSTR pszDest,
    __in size_t cchDest,
    __in STRSAFE_LPCSTR pszSrc)
{
    HRESULT hr;

    hr = StringValidateDestA(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);
    
    if (SUCCEEDED(hr))
    {
        hr = StringCopyWorkerA(pszDest,
                               cchDest,
                               NULL,
                               pszSrc,
                               STRSAFE_MAX_LENGTH);
    }

    return hr;
}

STRSAFEAPI
StringCchCopyW(
    __out_ecount(cchDest) STRSAFE_LPWSTR pszDest,
    __in size_t cchDest,
    __in STRSAFE_LPCWSTR pszSrc)
{
    HRESULT hr;
    
    hr = StringValidateDestW(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);

    if (SUCCEEDED(hr))
    {
        hr = StringCopyWorkerW(pszDest,
                               cchDest,
                               NULL,
                               pszSrc,
                               STRSAFE_MAX_LENGTH);
    }

    return hr;
}
#endif  // !STRSAFE_NO_CCH_FUNCTIONS


#ifndef STRSAFE_NO_CB_FUNCTIONS

#ifdef UNICODE
#define StringCbCopy  StringCbCopyW
#else
#define StringCbCopy  StringCbCopyA
#endif // !UNICODE

STRSAFEAPI
StringCbCopyA(
    __out_bcount(cbDest) STRSAFE_LPSTR pszDest,
    __in size_t cbDest,
    __in STRSAFE_LPCSTR pszSrc)
{
    HRESULT hr;
    size_t cchDest = cbDest / sizeof(char);

    hr = StringValidateDestA(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);

    if (SUCCEEDED(hr))
    {
        hr = StringCopyWorkerA(pszDest,
                               cchDest,
                               NULL,
                               pszSrc,
                               STRSAFE_MAX_LENGTH);
    }

    return hr;
}

STRSAFEAPI
StringCbCopyW(
    __out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
    __in size_t cbDest,
    __in STRSAFE_LPCWSTR pszSrc)
{
    HRESULT hr;
    size_t cchDest = cbDest / sizeof(wchar_t);

    hr = StringValidateDestW(pszDest, cchDest, NULL, STRSAFE_MAX_CCH);

    if (SUCCEEDED(hr))
    {
        hr = StringCopyWorkerW(pszDest,
                               cchDest,
                               NULL,
                               pszSrc,
                               STRSAFE_MAX_LENGTH);
    }

    return hr;
}
#endif  // !STRSAFE_NO_CB_FUNCTIONS
//(4)分配内存给UNICODE

malloc(sizeof(TCHAR) * nLen);//TRUE
malloc(nLen);//false

(5)StringCchPrintf是替代sprintf。

它接受一个格式字符串和参数列表和返回一个格式化字符串。

大小,在字符,目的地缓冲区提供函数来确保StringCchPrintf不写这个缓冲区的末尾的。

HRESULT StringCchPrintf(          LPTSTR pszDest,
    size_t cchDest,
    LPCTSTR pszFormat,
     ...
);

如下:

	StringCchPrintf(szInfo,_countof(szInfo),_T("KernelTime=%u | UserTime = %u"),KernelTime.dwLowDateTime/10000,
		UserTime.dwLowDateTime/10000);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值