- 浏览: 586763 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (365)
- Tomcat调优 (2)
- Apache Http (20)
- Webserver安装 (5)
- Linux安装 (28)
- Linux常用命令 (17)
- C语言及网络编程 (10)
- 文件系统 (0)
- Lucene (12)
- Hadoop (9)
- FastDFS (8)
- 报表 (0)
- 性能测试 (1)
- JAVA (18)
- CSharp (3)
- C++ (38)
- BI (0)
- 数据挖掘 (0)
- 数据采集 (0)
- 网址收集整理 (3)
- Resin (0)
- JBoss (0)
- nginx (0)
- 数据结构 (1)
- 随记 (5)
- Katta (1)
- Shell (6)
- webservice (0)
- JBPM (2)
- JQuery (6)
- Flex (41)
- SSH (0)
- javascript (7)
- php (13)
- 数据库 (6)
- 搜索引擎排序 (2)
- LVS (3)
- solr (2)
- windows (1)
- mysql (3)
- 营销软件 (1)
- tfs (1)
- memcache (5)
- 分布式搜索 (3)
- 关注的博客 (1)
- Android (2)
- clucene (11)
- 综合 (1)
- c c++ 多线程 (6)
- Linux (1)
- 注册码 (1)
- 文件类型转换 (3)
- Linux 与 asp.net (2)
- perl (5)
- coreseek (1)
- 阅读器 (2)
- SEO (1)
- 励志 (1)
- 在线性能测试工具 (1)
- yii (7)
- 服务器监控 (1)
- 广告 (1)
- 代理服务 (5)
- zookeeper (8)
- 广告联盟 (0)
- 常用软件下载 (1)
- 架设自已的站点心得 (0)
最新评论
-
terry07:
java 7 用这个就可以了 Desktop desktop ...
关于java Runtime.getRunTime.exec(String command)的使用 -
HSINKING:
怎么设置打开的dos 窗口是指定的路径下
关于java调用bat文件,不打开窗口 -
liubang201010:
hyperic hq更多参考资料,请访问:http://www ...
hyperic-hq -
^=^:
STDIN_FILENO是unistd.h中定义的一个numb ...
深入理解dup和dup2的用法 -
antor:
留个记号,学习了
[转]用java流方式判断文件类型
如何使用微软提供的TCHAR.H头文件?
2010-06-09 19:58
2010-06-09 19:58
如果你现在写的代码使用的是SBCS (ASCII)字符集,但是过一段时间后某个客户跟你说他们现在的系统只支持Unicode (wide-character)字符集,你怎么办呢?问题的答案就在微软给我们提供的tchar.h头文件里面! 通过研究msdn知道,微软为了方便程序写出能够使用不同字符集的通用代码,特别为程序员提供了这个头文件,头文件的功能就是实现了 数据类型、函数以及其他对象依据宏定义进行map过程。 msdn的对该文件的描述如下: To simplify transporting code for international use, the Microsoft run-time library provides Microsoft-specific generic-text mappings for many data types, routines, and other objects. 这样我们就可以使用TCHAR.H头文件中的定义的这些mapping写出可以运行于不同字符集上的通用代码;你所需要做的就是在包含该头文件后在编译器选项里面定义好所需要的宏或者在你的源文件里使用#define定义所需要的宏也可以。 需要说明的是TCHAR.H给出的mapping过程是微软专有的并不是ANSI标准,这点要注意,也就是说在微软之外的系统可能就不可以使用了。 在编译器编译过程中会检查你所定义的宏,然后将TCHAR.H文件中的以_tcs打头的函数转换成对应的str或wcs大头的函数。如果你要build一个使用UNICODE字符集的程序,则可以定义_UNICODE宏。如果要build一个single-byte的程序则不需要定义任何宏,单字节字符程序时默认的(对于WIN32是这样,对于WINCE默认则是unicode字符程序)。 我们特别要注意头文件中定义的类型--_TCHAR;这个类型也是与使用的字符集类型有关的,如果是单字符集则其被定义成char类型;如果是宽字符集程序则是wchar_t类型,是16bit的。 如果我们不知道自己的系统究竟使用的是什么字符集我们可以使用_tcs打头的系列函数和_TCHAR类型是不会错的,编译器在编译过程中自己会做出正确的映射。 我们给出一个例子: 如果我们这样写程序: _TCHAR *RetVal, *szString; RetVal = _tcsrev(szString); 如果预编译系统定义了宏_UNICODE ,则上述代码被翻译成如下: wchar_t *RetVal, *szString; RetVal = _wcsrev(szString); 如果没有定义宏_UNICODE ,则preprocessor maps 该代码to single-byte ASCII code: char *RetVal, *szString; RetVal = strrev(szString); Thus you can write, maintain, and compile a single source code file to run with routines that are specific to either single byte or Unicode character sets. 【注意】 我们有时候会看到这样的函数wsprintf,有人会和swprintf比较,其实这两个函数对用用户来说是一样的,只不过前者是在Winbase.h声明,Winbase.c中定义的;后者是在stdio.h, stdlib.h文件中声明。 转载一篇很好的博文,如果你能看完以下的博文你就能彻底的理解windows系统中编程时乱想纷飞的字符错类型了: Windows环境下Unicode编程总结 UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下。 UNICODE编译设置: C/C++, Preprocessor difinitions 去除_MBCS,加_UNICODE,UNICODE 在ProjectSetting/link/output 中设置Entry为wWinMainCRTStartup 反之为MBCS(ANSI)编译。 Unicode :宽字节字符集 1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数? 可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。 调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。 2. 如何对DBCS(双字节字符集)字符串进行操作? 函数 描述 PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址 PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址 BOOL IsDBCSLeadByte( BYTE ); 如果该字节是DBCS字符的第一个字节,则返回非0值 3. 为什么要使用Unicode? (1) 可以很容易地在不同语言之间进行数据交换。 (2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。 (3) 提高应用程序的运行效率。 Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那幺系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。 Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数 Windows 98 只支持ANSI,只能为ANSI开发应用程序。 Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。 4. 如何编写Unicode源代码? Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。 _UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。 5. Windows定义的Unicode数据类型有哪些? 数据类型 说明 WCHAR Unicode字符 PWSTR 指向Unicode字符串的指针 PCWSTR 指向一个恒定的Unicode字符串的指针 对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。 ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。 6. 如何对Unicode进行操作? 字符集 特性 实例 ANSI 操作函数以str开头 strcpy Unicode 操作函数以wcs开头 wcscpy MBCS 操作函数以_mbs开头 _mbscpy ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库) ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数) 所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义: #ifdef UNICODE #define CreateWindowEx CreateWindowExW #else #define CreateWindowEx CreateWindowExA #endif // !UNICODE 7. 如何表示Unicode字符串常量? 字符集 实例 ANSI “string” Unicode L“string” ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ } 8. 为什么应当尽量使用操作系统函数? 这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。 如:StrCat,StrChr,StrCmp和StrCpy等。 9. 如何编写符合ANSI和Unicode的应用程序? (1) 将文本串视为字符数组,而不是chars数组或字节数组。 (2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。 (3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。 (4) 将TEXT宏用于原义字符和字符串。 (5) 执行全局性替换(例如用PTSTR替换PSTR)。 (6)修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那幺请记住要按字节来分配内存。这就是说,应该调用 malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。 10. 如何对字符串进行有选择的比较? 通过调用CompareString来实现。 标志 含义 NORM_IGNORECASE 忽略字母的大小写 NORM_IGNOREKANATYPE 不区分平假名与片假名字符 NORM_IGNORENONSPACE 忽略无间隔字符 NORM_IGNORESYMBOLS 忽略符号 NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符 SORT_STRINGSORT 将标点符号作为普通符号来处理 11. 如何判断一个文本文件是ANSI还是Unicode? 判断如果文本文件的开头两个字节是0xFF和0xFE,那幺就是Unicode,否则是ANSI。 12. 如何判断一段字符串是ANSI还是Unicode? 用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。 13. 如何在Unicode与ANSI之间转换字符串? Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。 //======================================================================== //TITLE: // MultiByteToWideChar和WideCharToMultiByte用法详解 //AUTHOR: // norains //DATE: // 第一版:Monday 25-December -2006 // 增补版:Wednesday 27-December -2006 // 修订版:Wednesday 14-March-2007 (修正之前的错误例子) //Environment: // EVC4.0 + Standard SDK //======================================================================== 1.使用方法详解 在本文开始之处,先简要地说一下何为短字符和宽字符. 所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于 windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说. 宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水. 好吧,那就让我们开始吧. 这个是我们需要转化的多字节字符串: char sText[20] = {"多字节字符串!OK!"}; 我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个 20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意. 所幸,我们能够确知所需要的数组空间. 我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数: DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0); 接下来,我们只需要分配响应的数组空间: wchar_t *pwText; pwText = new wchar_t[dwNum]; if(!pwText) { delete []pwText; } 接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子: MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize); 最后,使用完毕当然要记得释放占用的内存: delete []psText; 同理,宽字符转为多字节字符的代码如下: wchar_t wText[20] = {L"宽字符转换实例!OK!"}; DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE); char *psText; psText = new char[dwNum]; if(!psText) { delete []psText; } WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE); delete []psText; 如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢? WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装: //------------------------------------------------------------------------------------- //Description: // This function maps a character string to a wide-character (Unicode) string // //Parameters: // lpcszStr: [in] Pointer to the character string to be converted // lpwszStr: [out] Pointer to a buffer that receives the translated string. // dwSize: [in] Size of the buffer // //Return Values: // TRUE: Succeed // FALSE: Failed // //Example: // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0])); //--------------------------------------------------------------------------------------- BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize) { // Get the required size of the buffer that receives the Unicode // string. DWORD dwMinSize; dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0); if(dwSize < dwMinSize) { return FALSE; } // Convert headers from ASCII to Unicode. MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); return TRUE; } //------------------------------------------------------------------------------------- //Description: // This function maps a wide-character string to a new character string // //Parameters: // lpcwszStr: [in] Pointer to the character string to be converted // lpszStr: [out] Pointer to a buffer that receives the translated string. // dwSize: [in] Size of the buffer // //Return Values: // TRUE: Succeed // FALSE: Failed // //Example: // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0])); //--------------------------------------------------------------------------------------- BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize) { DWORD dwMinSize; dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE); if(dwSize < dwMinSize) { return FALSE; } WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE); return TRUE; } 使用方法也很简单,示例如下: wchar_t wText[10] = {L"函数示例"}; char sText[20]= {0}; WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0])); MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0])); 这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便. 2.MultiByteToWideChar()函数乱码的问题 有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此. 不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文". 系统定制时选择默认语言的位置于: Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可. 14. Unicode和DBCS之间的区别 Unicode使用(特别在C程序设计语言环境里)“宽字符集”。「Unicode中的每个字符都是16位宽而不是8位宽。」在Unicode中,没有单单使用8位数值的意义存在。相比之下,在“双位组字符集”中我们仍然处理8位数值。有些位组自身定义字符,而某些位组则显示需要和另一个位组共同定义一个字符。 处理DBCS字符串非常杂乱,但是处理Unicode文字则像处理有秩序的文字。您也许会高兴地知道前128个Unicode字符(16位代码从 0x0000到0x007F)就是ASCII字符,而接下来的128个Unicode字符(代码从0x0080到0x00FF)是ISO 8859-1对ASCII的扩展。Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。希腊字母表使用从0x0370到0x03FF 的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码。Unicode的最大好处是这里只有一个字符集,没有一点含糊。 15.衍生标准 Unicode是一个标准。UTF-8是其概念上的子集,UTF-8是具体的编码标准。而UNICODE是所有想达到世界统一编码标准的标准。UTF-8标准就是Unicode(ISO10646)标准的一种变形方式, UTF的全称是:Unicode/UCS Transformation Format,其实有两种UTF,一种是UTF-8,一种是UTF-16, 不过UTF-16使用较少,其对应关系如下: 在Unicode中编码为 0000 - 007F 的 UTF-8 中编码形式为: 0xxxxxxx 在Unicode中编码为 0080 - 07FF 的 UTF-8 中编码形式为: 110xxxxx 10xxxxxx 在Unicode中编码为 0000 - 007F 的 UTF-8 中编码形式为: 1110xxxx 10xxxxxx 10xxxxxx utf-8是unicode的一个新的编码标准,其实unicode有过好几个标准.我们知道一直以来使用的unicode字符内码都是16位,它实际上还不能把全世界的所有字符编在一个平面系统,比如中国的藏文等小语种,所以utf-8扩展到了32位,也就是说理论在utf-8中可容纳二的三十二次方个字符. UNICODE的思想就是想把所有的字符统一编码,实现一个统一的标准.big5、gb都是独立的字符集,这也叫做远东字符集,把它拿到德文版的 WINDOWS上可能将会引起字符编码的冲突....早期的WINDOWS默认的字符集是ANSI.notepad中输入的汉字是本地编码,但在 NT/2000内部是可以直接支持UNICODE的。notepad.exe在WIN95和98中都是ANSI字符,在NT中则是 UNICODE.ANSI和UNICODE可以方便的实现对应映射,也就是转换 ASCII是8位范围内的字符集,对于范围之外的字符如汉字它是无法表达的。unicode是16位范围内的字符集,对于不同地区的字符分区分配,unicode是多个IT巨头共同制定的字符编码标准。如果在unicode环境下比如WINDOWS NT上,一个字符占两字节16位,而在ANSI环境下如WINDOWS98下一个字符占一个字节8位.Unicode字符是16位宽,最多允许 65,535字符,数据类型被称为WCHAR。 对于已有的ANSI字符,unicode简单的将其扩展为16位:比如ANSI"A"=0x43,则对应的UNICODE为 "A"= 0x0043 而ASCII用七存放128个字符,ASCII是一个真正的美国标准,所以它不能满足其他国家的需要,例如斯拉夫语的字母和汉字于是出现了Windows ANSI字符集,是一种扩展的ASCII码,用8位存放字符,低128位仍然存放原来的ASCII码, 而高128位加入了希腊字母等 if def UNICODE TCHAR = wchar else TCHAR = char 你需要在Project\Settings\C/C++\Preprocesser definitions中添加UNICODE和_UNICODE UINCODE,_UNICODE都要定义。不定义_UNICODE的话,用SetText(HWND,LPCTSTR),将被解释为 SetTextA(HWND,LPTSTR),这时API将把你给的Unicode字符串看作ANSI字符串,显示乱码。因为windows API是已经编译好存在于dll中的,由于不管UNICODE还是ANSI字符串,都被看作一段buffer,如"0B A3 00 35 24 3C 00 00"如果按ANSI读,因为ANSI字串是以''''''''\0''''''''结束的,所以只能读到两字节"0B A3 \0",如果按UNICODE读,将完整的读到''''''''\0\0''''''''结束。 由于UNICODE没有额外的指示位,所以系统必须知道你提供的字串是哪种格式。此外,UNICODE好象是ANSI C++规定的,_UNICODE是windows SDK提供的。如果不编写windows程序,可以只定义UNICODE。 开发过程: 围绕着文件读写、字符串处理展开。文件主要有两种:.txt和.ini文件 1. 在unicode和非unicode环境下字符串做不同处理的,那么需要参考以上9,10两条,以适应不同环境得字符串处理要求。 对文件读写也一样。只要调用相关接口函数时,参数中的字符串前都加上_TEXT等相关宏。如果写成的那个文件需要是unicode格式保存的,那么在创建文件时需要加入一个字节头。 CFile file; WCHAR szwBuffer[128]; WCHAR *pszUnicode = L"Unicode string\n"; // unicode string CHAR *pszAnsi = "Ansi string\n"; // ansi string WORD wSignature = 0xFEFF; file.Open(TEXT("Test.txt"), CFile::modeCreate|CFile::modeWrite); file.Write(&wSignature, 2); file.Write(pszUnicode, lstrlenW(pszUnicode) * sizeof(WCHAR)); // explicitly use lstrlenW function MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, szwBuffer, 128); file.Write(szwBuffer, lstrlenW(szwBuffer) * sizeof(WCHAR)); file.Close(); //以上这段代码在unicode和非unicode环境下都有效。这里显式的指明用Unicode来进行操作。 2. 在非unicode环境下,缺省调用的都是ANSI格式的字符串,此时TCHAR转换为CHAR类型的,除非显式定义WCHAR。所以在这个环境下,如果读取unicode文件,那么首先需要移动2个字节,然后读取得字符串需要用MultiByteToWideChar来转换,转换后字符串信息才代表 unicode数据。 3. 在unicode环境下,缺省调用得都是unicode格式得字符串,也就是宽字符,此时TCHAR转换为WCHAR,相关得API函数也都调用宽字符类型的函数。此时读取unicode文件也和上面一样,但是读取得数据是WCHAR的,如果要转换成ANSI格式,需要调用 WideCharToMultiByte。如果读取ANSI的,则不用移动两个字节,直接读取然后视需要转换即可。 某些语言(如韩语)必须在unicode环境下才能显示,这种情况下,在非unicode环境下开发,就算用字符串函数转换也不能达到显示文字的目的,因为此时调用得API函数是用ANSI的(虽然底层都是用UNICODE处理但是处理结果是按照程序员调用的API来显示的)。所以必须用unicode来开发。 【总结】 看了这么多的资料也专研了这么长时间,也应该对自己的认识做个小结了,如果我们是写 windows程序时,在编写操作字符的程序时,我们可以调用运行时库的函数,运行时库中的函数接口定义都是行业标准的,也就是说如果你使用的都是运行时库函数则你的程序在windows上开发的,但是编译后也可以在linux系统上运行,只要这连个系统的编译器所使用的运行时库中的函数都严格按照国际标准实现的就ok。 你如果在windows上编程,编译并运行,你当然可以使用windows系统提供给你的函数,这些函数得到了windows系统的支持。当然这样的程序编译后也只能在windows系统上运行,其他系统上无法正常执行。所有如果你再 windows上开发程序,而又想在其他系统上运行,这只能使用运行时库函数了。 小结就这么多,如果有错的地方请看官指正,欢迎交流!!!
发表评论
-
[转载]strftime() 函数_时间格式
2011-01-12 11:21 1195[转载]strftime() 函数 (2007-12-06 1 ... -
fork函数
2011-01-11 13:23 924引用 在linux中,只有一 ... -
如何调试守护进程
2011-01-11 13:05 3219如何调试守护进程 我写 ... -
UNIX管道编程——使用pipe函数,dup函数,dup2函数
2011-01-11 10:02 51842009-12-29 11:46管道在unix ... -
c中的管道及复制描述符
2011-01-10 17:22 12481、 #include <stdio.h& ... -
如何在运行时确定对象类型(RTTI)
2011-01-10 11:45 947引用作者:NorthTibet RTTI 是“R ... -
string, char*, int类型转换 , c++强制转化
2011-01-10 10:04 16520一、 以下是常用的几种类型互相之间的转换 string 转 ... -
linux信号机制之sigaction结构体浅析
2011-01-10 00:27 1409linux 2009-02-20 16:47:00 阅读460 ... -
Linux下的管道编程技术-dup函数和dup2函数
2011-01-09 23:45 1152from [url]http://www.xxlinux.co ... -
Linux下使用C/C++访问数据库
2011-01-07 16:19 1348Linux下使用C/C++访问数据库——MySQL篇 ... -
多核分布式队列的实现:“偷”与“自私”的运用
2011-01-06 11:38 1069原创作品,允许转载, ... -
Boost和STL学习资料大全
2011-01-06 09:38 2646from http://blog.csdn.net/k2eat ... -
linux平台上编译安装boost库
2011-01-06 09:33 6743from http://dev.firnow.com/co ... -
C++多线程入门
2010-12-30 09:52 1254第1节 背景 为了更好 ... -
c++中__declspec用法总结
2010-12-29 17:47 1793c++中__declspec用法总结C++ ... -
__cplusplus的用处
2010-12-29 14:07 1067作者: Aprilgogo 发表日期: 2007-03-1 ... -
#ifdef __cplusplus深度剖析
2010-12-29 14:06 833时常在cpp的代码之中看 ... -
C和C++之间库的互相调用
2010-12-29 13:44 1061C和C++之间库的互相调用 昨晚有个朋友问我关于在C中调用C ... -
c, c++ 库调用相关知识
2010-12-29 13:41 13851。 重载是如何实现的 ... -
放在函数后面的const是什么意思?
2010-12-17 16:13 1483经常看到这样的定义: void f() const ...
相关推荐
在C语言中,开发图形用户界面(GUI)应用程序通常涉及使用Windows API(应用程序接口),这是一个由微软提供的编程接口,允许开发者创建与Windows操作系统交互的应用。本文档“窗体--C语言.doc”似乎介绍如何使用...
Windows API(Application Programming Interface)是微软提供的一个接口,允许开发者直接与操作系统进行交互,实现更底层的功能。C++ Builder则是一款强大的集成开发环境,它以其对C++语言的良好支持和对Windows ...
32. 使用TCHAR.H数据类型和_MBCS内存分配:提供了如何在多字节和宽字符集之间进行选择和操作的示例。 33. Windows运行时不支持的CRT函数:列出了一些特定于Windows运行时环境不支持的CRT函数。 34. 内部CRT全局...
`tchar.h`头文件包含了一系列宏和类型定义,用于处理宽字符(Unicode)和窄字符(ANSI)字符串,确保代码在不同的字符集环境下的兼容性。 6. **开发实践**: - 开发者在使用MSCHAR时,需要了解Windows字符编码规则...
`TCHAR.H` 头文件提供了条件编译宏 `UNICODE`,根据是否定义该宏来选择使用 `char` 还是 `wchar_t` 类型,以及相应的字符串处理函数。 以上就是关于 Windows API 编程的基础知识点,涵盖了如何编写第一个程序、窗口...
在给定的部分代码中,可以看到使用了多种头文件,如`stdio.h`、`windows.h`、`tchar.h`等,这些头文件为程序提供了必要的功能支持,如文件操作、Windows API调用、宽字符处理等。 代码中定义了一系列常量,用于指定...
首先,代码中包含了必要的头文件,如`windows.h`、`windowsx.h`、`tchar.h`、`strsafe.h`和`resource.h`,这些是编写Windows应用程序的基础。`#pragma warning(disable:4312)`和`#pragma warning(disable:4244)`用于...
在VC++项目中,你需要包含相应的头文件`<windows.h>`,这是包含所有Windows API函数定义的头文件。同时,为了正确处理字符串,你可能还需要包含`<tchar.h>`,这将根据你的项目设置(宽字符或多字符)自动选择合适的...
在VC++项目中,你可能还需要添加对`winsock2.h`和`ws2tcpip.h`头文件的引用,并链接`ws2_32.lib`库以使用Winsock功能。 上述代码段仅作为基本示例,实际应用中需要考虑错误处理、内存管理以及多线程环境下的同步...
最后,手册中还包含了一个使用TCHAR.H类型和_MBCS内存分配的示例程序,展示了如何在通用文本映射中使用这些特性。 总的来说,微软CRT官方手册是一个全面的参考资料,它不仅提供了丰富的技术信息,还对开发者在实际...
- **头文件**:`#include "windows.h"` 和 `#include "tchar.h"` 导入了必需的 Windows API 和字符处理宏。 - **主函数**:`WinMain` 是 Windows 程序的入口点。参数依次为:当前实例句柄、前一个实例句柄、命令行...
Windows API是Microsoft Windows操作系统提供的一系列函数库,它们允许程序员访问操作系统的核心服务。在获取计算机名称和工作组信息时,我们主要会用到`GetComputerName`和`GetWorkstationName`这两个API函数。 1....
GDI+是微软为Windows XP及其后续版本提供的绘图API,它扩展并改进了传统的GDI(Graphics Device Interface),提供更高级的图形处理功能。 ### GDI+简介 GDI+是在GDI的基础上进行改进的一个API,它提供了更多的...
而`CString`是Microsoft Foundation Classes (MFC)框架下的字符串类,功能更为强大,且具有安全特性,需要`atlstr.h`头文件和MFC库支持。值得注意的是,`CString`已经被独立出来,不再局限于MFC使用。 在编写跨平台...
- `#include`指令导入了必要的头文件,如`windows.h`、`stdio.h`、`tchar.h`等,为程序提供了基本的运行环境。 - 定义了多个结构体类型(例如`CREDENTIAL`),这些类型对应于Windows API中定义的凭证数据结构,...
#include<tchar.h> #include<rapi.h> #include<strsafe.h> #include #define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0])) void PrintDirectory(LPWSTR cePath, LPWSTR pcPath, UINT Indent) { DWORD foundCount; LPCE_...
它是微软Windows操作系统提供给应用程序的一种接口。 - **作用**:通过Windows API,开发者可以访问操作系统提供的各种服务,如窗口管理、图形绘制、文件处理等。 - **组成**:Windows API 主要由以下几部分组成: ...
1. 引入必要的头文件:在你的源代码中,你需要包含`<afxdll_.h>`,这将提供对`AfxGetModuleFileName()`的访问。 ```cpp #include <afxdll_.h> ``` 2. 使用`AfxGetModuleFileName()`:这个函数接受一个`HINSTANCE`...
MFC是微软为C++开发的一个强大的类库,它提供了丰富的API接口,用于构建Windows应用程序。本篇文章将深入探讨如何利用MFC来实现这个功能。 首先,我们需要了解Windows API中的`GetUserName`函数,它是Windows操作...