记录制作MFC项目遇到的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LawGeorge/article/details/81872957

1.字符编码问题

      为了程序的简易与快速开发,以后都选择Unicode作为工程的字符集。

转载于:https://www.cnblogs.com/gaohongchen01/p/4006700.html

多字节字符集:

  在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个 字符,总共表示128个字符,其中包括了 英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号。后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,为了能够表示其它国家的文字,各国在 ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以ASCII 127 bits为基础,兼容ASCII 127,他们使用大于128的编码作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与 Leading Byte一起作为实际的编码。这样的字符集有很多,我们常见的GB-2312就是其中之一。

Unicode字符集:

  Unicode的学名 是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。UCS只是规定如何编码,并没有规定如何传输、保存这个编码。UTF是“UCS Transformation Format”的缩写。

  Unicode字符集有多种编码形式,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的Unicode称为UTF-16。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8(注意UTF-8是编码,它属于Unicode字符集),使用类似MBCS的方式对Unicode进行编码。UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元。

  UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian),UTF-16需要通过在文件开头以名为BOM(Byte Order Mark)的字符来表明文件是Big Endian还是Little Endian。Unicode规范中推荐的标记字节顺序的方法是BOM(Byte Order Mark)。在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

  UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

  Windows就是使用BOM来标记文本文件的编码方式的。

  L是用来标志一个字符(串)为宽字符(串),当你在VS2005以上版本的IDE工作时,可以选择工作于这两种不同的编码方式下,而在Unicode方式下,则要对字符(串)常量前添加L来告诉编译器它是宽字符。MS为我们定义了好几个相关的宏:_T(定义于tchar.h)、_TEXT(同样定义于tchar.h)。

  TEXt():如果定义了Unicode,标识字符为Unicode;否则,为ANSI字符集。在VS2010使用Unicode字符集下:

  对于为什么使用Unicode?(以下引自《windows核心编程》)
  开发应用程序的时候,强烈建议你使用Unicode字符和字符串,理由如下:

  • Unicode使程序的本地化变得更容易;
  • 使用Unicode,只需发布一个二进制(.exe或DLL)文件,即可支持所有语言;
  • Unicode代码执行速度更快,占用内存更少,提升了应用程序的效率。自从Windows2K开始,Win的系统内核开始完全支持并完全应用Unicode编写,所有ANSI字符在进入底层前,都会被相应的API转换成Unicode。所以,如果你一开始就使用Unicode,则可以减少转换的用时和RAM开销。
  • 使用Unicode,你的应用程序能轻松调用所有不反对使用(nondeprecated)的Windows函数,因为一些Windows函数提供了只能处理Unicode字符和字符串的版本;
  • 使用Unicode,你的代码很容易与COM集成(后者要求使用Unicode字符和字符串);
  • 使用Unicode,你的代码很容易与.NET Framework集成(后者要要求使用Unicode字符和字符串);
  • 使用Unicode,能保证你的代码能够轻松操纵你自己的资源(其中的字符串总是Unicode的);
  • 世界上大多数程序用的字符集都是Unicode,因为Unicode有利于程序国际化和标准化;

应此,经过试验,在Windows编程中不要使用多级多字节字集,使用Unicode,并且不要使用char,使用wchar_t,而相应的字符操作如strcpy只要将潜在前缀str变成wcs就可以相同的操作wchar_t。

2.dll制作

首先要先明白dll与lib的联系区别。lib文件中包含的是函数的地址,而函数的实现在dll中,lib相当于.h文件,在编译的时候使用lib文件能够方便的使用dll中的函数,而不用动态的加载dll(LoadLibrary("xxx.dll")),虽然可以直接使用dll不用lib。而VS生成dll时默认不生成lib,要生成lib就需要添加边需要在边界工程的def文件。先在项目中设置生成map映射文件,在从该map文件中将要生成的函数添加到def文件下的EXPORTS下。再次生成就可以看到lib文件,并且是要添加相关声明定义的.h文件,再使用一下语句就可以调用函数或类。

#pragma comment(lib,"..\\DeBug\\CRapidFinder.lib")

具体参照:

https://blog.csdn.net/cbacq/article/details/51247694

http://blog.sina.com.cn/s/blog_81c6474c01015x1a.html

猜你喜欢

转载自blog.csdn.net/LawGeorge/article/details/81872957