Windows开发

登录以发表

上级专业


主管专家


文章

249

评论

989

今日更新

0

专业介绍

Windows,DotNET和C#


文章

249

评论

989

今日更新

0

专业介绍

Windows,DotNET和C#

Visual C++程序应该使用什么字符集,应该根据使用的需求来决定。 一、学习C/C++语言基础,编写可移植程序 如果是这个目的的话,使用ANSI C/C++函数和默认字符集就可以接受了,没必要使用其它字符集。因为对于大多数中国人来说,GBK字符集已经够用,并且默认字符集用char数组就可以表示,可以避免大多数麻烦的情况。(实际上,GBK当年是按“暂时代替Unicode”的字符集来设计的) 二、编写现代Windows程序 1.程序内码 程序内码应选择UTF-16,并使用wchar_t数组存储字符串。默认字符集(称为ANSI字符集)是为了兼容16位平台和Win9x平台存在的。现代Windows都是以UTF-16为内码的。在Windows中,使用老旧的默认字符集(GBK等)会频繁操作进程的堆内存用以转换字符串,降低程序效率。同时,不能在默认字符集表示的字符会变为问号,影响程序的稳定性。 使用UTF-16的好处显而易见,新加入的WinAPI、所有的COM组件、.NET和Java都使用UTF-16,使用UTF-16可以更方便地调用这些组件。UTF-16字符串处理起来也更加简单。 2.文件编码 保存文件时应根据需要选择ANSI、UTF-8、UTF-16。例如批处理文件和vbs文件必须以ANSI编码,INI配置文件可以用ANSI或UTF-16编码,而XML文件则通常以UTF-8编码

- 以上是置顶 -

许多书上都写了,应该始终使用_beginthreadex和_endthreadex,永远不要使用CreateThread和ExitThread,因为后者不会正常分配和释放C运行库的tiddata。但是,这是不准确的。 实际上,微软考虑到一些开发者喜欢用CreateThread和ExitThread,而不愿意用_beginthreadex和_endthreadex,并且喜欢把设计的禁区说成是系统的bug。因此做了一些设计,使得tiddata的处理变得自动化,尽可能地兼容这种不规范的用法。 WinXP(NT5.1)及以前的系统: 1、当用到tiddata时按需分配tiddata 2、当线程删除时,在msvcrXX.dll中监视DLL_THREAD_DETACH消息,并自动删除tiddata(无法照顾到静态链接的情况) WinServer2003(NT5.2)及更高版本的系统: 1、当用到tiddata时按需分配tiddata 2、用到了FlsAlloc函数而不是TlsAlloc函数,这个函数允许指定一个线程退出时自动执行的回调函数,C运行库会注册一个_freefls函数,当线程删除时自动删除tiddata 不过这个功能需要运行库支持,检查方法是找到VC\crt\src\tidtable.c里面是否存在FlsAlloc等文本。 有的地方提到CreateThread不支持signa

对于一般的程序,按照下面的方法存储可变数据就行了: Unicode程序(类似Chrome): 对于新系统,放到%[LOCAL]APPDATA%\OrgName\AppName 对于老系统,放到%APPDATA%\OrgName\AppName 非Unicode程序(类似Python 2.7): 如果要求整个树Authenticated Users允许修改(最简单实用): 放到%SYSTEMDRIVE%\AppName 最新的系统,系统根目录只能新建子文件夹,子文件夹才可以允许修改 如果要求整个树CREATOR OWNER完全控制,所有子文件夹Users可创建项目和修改属性(不推荐): 对于新系统,放到%PROGRAMDATA%\OrgName\AppName\user#hash# 对于老系统,放到%ALLUSERSPROFILE%\Application Data\OrgName\AppName\user#hash# 简单一句话就是: Unicode程序最好放到AppData子文件夹,非Unicode程序最好放到系统根目录子文件夹。 如果需要让用户能够备份自己的数据,可以把数据放到用户资料文件夹,SHGetSpecialFolderPath等API可以获取Windows中特殊文件夹的位

自从Windows 8.1废弃了GetVersionEx,必须写manifest才能正确获取系统版本之后,如何始终正确获取系统版本就是一个让人头疼的话题。大概有以下几种尝试。 尝试使用VerifyVersionInfo——实际上是没读懂微软的文档,这个函数也会被manifest影响 使用RtlGetVersion——早在XP时代就被很多人用于防止兼容模式了,所以Vista以后兼容模式也hook掉了,虽然不需要manifest,但是不保证以后还能用 使用RtlGetNtVersionNumbers——至今未文档化的函数,不推荐 实际上,有一种方法微软可能懒得造假,那就是VerQueryValue读取kernel32.dll等系统文件的产品版本号dwProductVersionMS/LS。有人可能会说,那以后微软不在这里写系统版本了怎么办?实际上,微软已经公开了这个做法,将来不可能大改,否则将有兼容性问题。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724429(v=vs.85).aspx 一般来说,系统文件版本号的格式是major.minor.build.rev。不过,已淘汰的Windows 95/98/Me并不遵守这个约定,它们的系统文件版本号是major.minor.0.build

nkc production server  https://github.com/kccd/nkc.git

科创研究院 (c)2001-2018

蜀ICP备11004945号-2 川公网安备51010802000058号