热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CreateFile()和CreateFileA()有什么区别?

如何解决《CreateFile()和CreateFileA()有什么区别?》经验,为你挑选了1个好方法。

我按照这里的教程与串口通信

打开然后关闭串口的主要代码如下:

HANDLE hComm;

hComm = CreateFileA((LPCSTR)"COM8",                //port name
    GENERIC_READ | GENERIC_WRITE, //Read/Write
    0,                            // No Sharing
    NULL,                         // No Security
    OPEN_EXISTING,// Open existing port only
    0,               // Non Overlapped I/O              // FILE_FLAG_NO_BUFFERING,            // copied from the MFC version
    NULL);        // Null for Comm Devices

if (hComm == INVALID_HANDLE_VALUE){
    DWORD err = GetLastError();
    printf("Error in opening serial port\n");
    printf("err = 0x%x\n", err);
}
else
    printf("opening serial port successful\n");

CloseHandle(hComm);//Closing the Serial Port

如果我使用CreateFile()代码编译正常但串口未打开(我收到Error in opening serial port消息)

在玩了一段时间的代码后,我发现CreateFileA()成功打开了串口(我发现这个的唯一原因是因为当我搜索CreateFile()功能时,我获得了MSDN定义页面CreateFileA()作为第一个结果

我用Google搜索,但我找不到两者之间的区别.我找到了这个,它说我应该总是CreateFile()和编译器应该做其余的,但它在我的情况下不起作用,只有在我专门使用时才有效CreateFileA()

是什么区别CreateFile()CreateFileA(),我应该用我的计划基本串口通信是哪一个?

Windows 10
Visual Studio 2013快递



1> 小智..:

这里需要对Windows API进行一些解释:微软很早就引入了Unicode.那时,他们决定用16位代表一个Unicode字符.我想当时这是一个有效的决定.wchar_t因此,Microsoft平台上的A 是16位宽,(Unicode)文本存储在wchar_ts中 - 这具有每个字符具有相等宽度的优点.缺点是处理的现有API char不再兼容.

如今,使用32位Unicode代码点,这看起来很愚蠢 - 微软平台上的Unicode文本使用UTF-16编码,因此您有两个缺点:不兼容简单char的字符串多字符序列.在许多其他平台上,wchar_t32位宽,Unicode存储在这些wchar_ts中或编码为"正常" char的UTF-8 .

但回到Microsoft API:为了解决这个问题,他们重命名所有处理字符串的API调用都有一个A后缀,并引入了第二组相同的调用wchar_t,后缀W为Unicode变体.根据编译时开关UNICODE,原始名称将被预处理器映射到带有后缀的实名.

您可能知道,C中的字符串文字具有该类型char *.要创建类型的字符串文字wchar_t *,您需要在其前面添加一个L.为了在UNICODE设置时自动执行此操作,提供了另一个宏:_T().因此,您希望在代码中执行的操作是将任何字符串文字包装在内_T(),它将LUNICODE定义时准确定义前缀.

因此,这一行:

hComm = CreateFileA((LPCSTR)"COM8"

应改为:

hComm = CreateFile(_T("COM8")

一句话LPCSTRLPWCSTR:它们现在等同于char *wchar_t *.所以铸造是不必要的.这些名称的原因是向后兼容具有分段存储器和"远指针"的古代系统.只要您不需要为win16编译代码,就忘了它们.


最后一个个人意见:Windows已经知道Unicode很长一段时间了(IIRC已经在Win95上)并且它现在已经成为标准.您不太可能想要定位不支持unicode的Windows系统.你更想写一些可移植的代码,然后问题是对Unicode的不同处理(wchar_t在Windows上,char在大多数其他系统上使用UTF-8,UTF-8在互联网上也占主导地位).

为了解决这个问题,我更喜欢总是定义UNICODE,使用wchar_t字符串文字来表示windows API所需的任何常量字符串(就像你的CreateFile()调用一样,只需要加上前缀L)并char使用UTF-8 在内部存储所有字符串,只有当你使用时才转换它们需要将它们传递给Windows API.执行转换有两个功能:MultiByteToWideChar()WideCharToMultiByte().这样,您就可以轻松地为使用UTF-8的其他操作系统的API编写适配器.


推荐阅读
author-avatar
in冷霜天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有