《windows核心编程》笔记(二)

单字节和双字节字符示例:

None.gif#include<string.h>
None.gif#include
<locale.h>
None.gif#include
<stdio.h>
None.gif#include
<stdlib.h>
None.gif#include
<mbstring.h>
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
char*str1="Count.";
InBlock.gifwchar_t
*wstr1=L"Count.";
InBlock.gif
char*mbstr1;
InBlock.gif
char*locale_string;
InBlock.gif
//strlengivesthelengthofsingle-bytecharacterstring
InBlock.gif
printf("Lengthof'%s':%d/n",str1,strlen(str1));
InBlock.gif
//wcslengivesthelengthofawidecharacterstring
InBlock.gif
wprintf(L"Lengthof'%s':%d/n",wstr1,wcslen(wstr1));
InBlock.gif
//Amultibytestring:[A][B][C][katakanaA][D][/0]
InBlock.gif
//inCodePage932.Forthisexampletoworkcorrectly,
InBlock.gif
//theJapaneselanguagesupportmustbeenabledbythe
InBlock.gif
//operatingsystem.
InBlock.gif
mbstr1="ABC""/x83/x40""D";
InBlock.giflocale_string
=setlocale(LC_CTYPE,"Japanese_Japan");
InBlock.gif
if(locale_string==NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifprintf(
"Japaneselocalenotenabled.Exiting./n");
InBlock.gifexit(
1);
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifprintf(
"Localesetto%s/n",locale_string);
ExpandedSubBlockEnd.gif}

InBlock.gif
//_mbslenwillrecognizetheJapanesemultibytecharacterifthe
InBlock.gif
//currentlocaleusedbytheoperatingsystemisJapanese
InBlock.gif
printf("Lengthof'%s':%d/n",mbstr1,_mbslen((constunsignedchar*)mbstr1));
InBlock.gif
//_mbstrlenwillrecognizetheJapanesemultibytecharacter
InBlock.gif
//sincetheCRTlocaleissettoJapaneseeveniftheOSlocale
InBlock.gif
//isnot.
InBlock.gif
printf("Lengthof'%s':%d/n",mbstr1,_mbstrlen(mbstr1));
InBlock.gifprintf(
"Bytesin'%s':%d/n",mbstr1,strlen(mbstr1));
InBlock.gifsystem(
"pause");
ExpandedBlockEnd.gif}

None.gif

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

2008060703.jpg

此外,windows还提供了一些函数来帮助我们对DBCS进行操作,比如CharPrev, CharNext, IsDBCSLeadByte等。

你应该知道的:

1) Windows 2000既支持Unicode,也支持ANSI,因此可以为任意一种开发应用程序。

2)Windows 98只支持ANSI,只能为ANSI开发应用程序。

3) Windows CE只支持Unicode,只能为Unicode开发应用程序。

4)Microsoft公司将COM1 6Windows转换成Win32时,公司作出了一个决定,即需要字符串的所有COM接口方法都只能接受Unicode字符串。


要支持Unicode,只需要定义两个宏(UNICODE_UNICODE),就可以修改然后重新编译该源文件。

C运行时库也添加了对Unicode的支持,定义了wchat_t及相关的处理函数,如wcscat,wcschr,wcscpy,wcslen等。

但为了能建立ANSI/Unicode通用代码,不应该直接调用str函数或wcs函数,而是应该使用一组宏,若定义了_UNICODE,就引用wsc这组函数,若没有,则引用str这组函数。例如,_tcscpy这个宏,若定义了_UNICODE,就扩展为wcscpy,若没有,则扩展为strcpy

None.gifTCHAR*szCh=_TEXT("error");
None.gif
if(szCh[0]==_TEXT('e'))
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifprintf(
"ok");
ExpandedBlockEnd.gif}

None.gif

WHAR Unicode字符

PWSTR 指向Unicode字符串的指针

PCWSTR 指向一个恒定的Unicode字符串的指针

这些数据类型是指Unicode字符和字符串。Windows头文件也定义了A N S I / Unicode通用数据类型PTSTRPCTSTR。这些数据类型既可以指A N S I字符串,也可以指Unicode字符串,这取决于当编译程序模块时是否定义了Unicode宏。这里的Unicode宏没有前置的下划线。_Unicode宏用于C运行期头文件,而Unicode宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。


将文本串视为字符数组,而不是chars数组或字节数组。

将通用数据类型(如TCHARPTSTR)用于文本字符和字符串。

将显式数据类型(如BYTEPBYTE)用于字节、字节指针和数据缓存。

TEXT宏用于原义字符和字符串。

执行全局性替换(例如用PTSTR替换PSTR)。

修改字符串运算问题。例如函数通常希望你在字符中传递一个缓存的大小,而不是字节。

这意味着你不应该传递sizeof (szBuffer ) ,而应该传递( sizeof (szBuffer ) / sizeof (TCHAR )。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)), 而不是调用malloc( nChar)

Windows也提供了一组用于对Unicode字符串进行操作的函数

lstrcat 将一个字符串置于另一个字符串的结尾处

lstrcmp 对两个字符串进行区分大小写的比较

lstrcmpi 对两个字符串进行不区分大小写的比较

lstrcpy 将一个字符串拷贝到内存中的另一个位置

lstrlen 返回字符串的长度(按字符数来计量)

C运行期函数strcmpstrcmp iwcscmpwcscmpi只是对字符串中的代码点的值进行比较,这就是说,这些函数将忽略实际字符的含义,只是将第一个字符串中的每个字符的数值与第二个字符串中的字符的数值进行比较。而Windows函数lstrcmplstrcmpi是作为对Windows函数CompareString的调用来实现的。

None.gifintCompareString(
None.gif
None.gifLCIDLocale,
None.gif
None.gifDWORDdwCmpFlags,
None.gif
None.gifLPCTSTRlpString1,
None.gif
None.gif
intcchCount1,
None.gif
None.gifLPCTSTRlpString2,
None.gif
None.gif
intcchCount2
None.gif
None.gif);
None.gif


该函数对两个

Unicode字符串进行比较。CompareString的第一个参数用于设定语言I DLCID),这是个32位值,用于标识一种特定的语言。CompareString使用这个LCID来比较这两个字符串,方法是对照一种特定的语言来查看它们的字符的含义

LCID GetThreadLocale(void);

lstrcmp函数系列中的任何一个函数调用CompareString时,该函数便将调用WindowsGetThreadLocale函数的结果作为第一个参数来传递:每次创建一个线程时,它就被赋予一种语言。函数将返回该线程的当前语言设置。

None.gif#include<windows.h>
None.gif#include
<tchar.h>
None.gif#include
<stdio.h>
None.gif
None.gif
intCDECLMessageBoxPrintf(TCHAR*szCaption,TCHAR*szFormat,dot.gif)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifTCHARszBuffer[
1024];
InBlock.gifva_listpArgList;
InBlock.gif
InBlock.gif
//Theva_startmacro(definedinSTDARG.H)isusuallyequivalentto:
InBlock.gif
//pArgList=(char*)&szFormat+sizeof(szFormat);
InBlock.gif

InBlock.gifva_start(pArgList,szFormat);
InBlock.gif
InBlock.gif
//Thelastargumenttowvsprintfpointstothearguments
InBlock.gif

InBlock.gif_vsntprintf(szBuffer,
sizeof(szBuffer)/sizeof(TCHAR),
InBlock.gifszFormat,pArgList);
InBlock.gif
InBlock.gif
//Theva_endmacrojustzeroesoutpArgListfornogoodreason
InBlock.gif
va_end(pArgList);
InBlock.gif
returnMessageBox(NULL,szBuffer,szCaption,0);
ExpandedBlockEnd.gif}

None.gif
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
None.gifPSTRszCmdLine,
intiCmdShow)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
intcxScreen,cyScreen;
InBlock.gifcxScreen
=GetSystemMetrics(SM_CXSCREEN);
InBlock.gifcyScreen
=GetSystemMetrics(SM_CYSCREEN);
InBlock.gif
InBlock.gifMessageBoxPrintf(TEXT(
"ScrnSize"),
InBlock.gifTEXT(
"Thescreenis%ipixelswideby%ipixelshigh."),
InBlock.gifcxScreen,cyScreen);
InBlock.gif
return0;
ExpandedBlockEnd.gif}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页