我有一个C应用程序,需要在Windows中编译。我真的无法理解UNICODE和ANSI在Windows中的概念
我想使用GetDriveType函数,其中有两个变量A和W。还有一个注释这里说,GetDriveType是两者的别名,并将根据某些预处理器进行选择。
但是我该怎么称呼这个函数呢?
这就是我想要做的:
const TCHAR* path = "C:\\Users\\";
const TCHAR* trailing_slash = "\\";
size_t requiredSize = mbstowcs(NULL, path, 0);
TCHAR* win_path = (char*)malloc((requiredSize + 2) * sizeof(char));
UINT driveType = 0;
strncpy(win_path, path, requiredSize + 1);
strncat(win_path, trailing_slash, 2);
printf("Checking path: %s\n", win_path);
driveType = GetDriveType(win_path);
wprintf(L"Drive type is: %d\n", driveType);
if (driveType == DRIVE_FIXED)
printf("Success\n");
else
printf("Failure\n");
return 0;它产生的结果
Checking path: C:\Users\
Drive type is: 1
Failure如果我用GetDriveType替换GetDriveTypeA,它返回正确的值3并成功。
我也试过另一种变体
size_t requiredSize = mbstowcs(NULL, path, 0);
uint32_t drive_type = 0;
const wchar_t *trailing_slash = L"\\";
wchar_t *win_path = (wchar_t*) malloc((requiredSize + 2) * sizeof(wchar_t));
/* Convert char* to wchar* */
size_t converted = mbstowcs(win_path, path, requiredSize+1);
/* Add a trailing backslash */
wcscat(win_path, trailing_slash);
/* Finally, check the path */
drive_type = GetDriveType(win_path);我看到了这样的警告:
'function' : incompatible types - from 'wchar_t *' to 'LPCSTR'那么,用哪一种呢?它怎么是通用的?我将读取的路径来自Windows上的一个环境变量
TCHAR和wchar_t等是什么?我找到了这个帖子,但不太懂
这个微软帖子说
根据您的偏好,您可以显式地调用Unicode函数,例如SetWindowTextW,或者使用宏。
所以,可以在任何地方使用wchar_t并直接调用GetDriveTypeW吗?
发布于 2021-12-15 23:32:38
在90年代中期,Windows 95/98/ME不支持Unicode,NT4/2000/XP则支持Unicode。您可以通过更改UNICODE定义来创建可以编译或不支持Unicode的源代码。
这种类型的代码如下所示:
UINT type = GetDriveType(TEXT("c:\\"));没有名为GetDriveType的函数,在Windows中接受字符串参数的所有函数中,99%有两个版本,本例中为GetDriveTypeA和GetDriveTypeW。
在Windows头文件中,有如下代码:
#ifdef UNICODE
#define GetDriveType GetDriveTypeW
#else
#define GetDriveType GetDriveTypeA
#endif如果UNICODE是在包含windows.h之前定义的,则上面的代码展开为:
UINT type = GetDriveTypeW(L"c:\\");如果没有,则:
UINT type = GetDriveTypeA("c:\\");如今,大多数应用程序都应该使用Unicode。您应该使用wchar_t/WCHAR并直接调用GetDriveTypeW还是仍然依赖定义,这是一个风格问题。在某些情况下,您也需要强制使用A或W函数和那没什么。
这同样适用于具有_TEXT宏和_tcs函数的C库,但它们是由_UNICODE定义控制的。
如果收到不兼容字符串类型的警告,则调用错误的函数,或者没有添加#define UNICODE (和_UNICODE)。如果您正在编译用于Unix的跨平台代码,则可能需要在某些地方将char*转换为宽字符串。
另请参阅:
https://stackoverflow.com/questions/70366570
复制相似问题