《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
int main()
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.gif TCHAR * 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.gif int CompareString(
None.gif
None.gifLCIDLocale,
None.gif
None.gifDWORDdwCmpFlags,
None.gif
None.gifLPCTSTRlpString1,
None.gif
None.gif
int cchCount1,
None.gif
None.gifLPCTSTRlpString2,
None.gif
None.gif
int cchCount2
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
int CDECLMessageBoxPrintf(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
int WINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
None.gifPSTRszCmdLine,
int iCmdShow)
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}
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值