提问人:mittal 提问时间:12/15/2021 最后编辑:Thomas Dickeymittal 更新时间:5/24/2023 访问量:258
如何使用泛型函数 GetDriveType
How to use generic function GetDriveType
问:
我有一个 C 应用程序,我需要在 .我真的无法把我的脑袋包裹在和概念上Windows
UNICODE
ANSI
Windows
我想使用函数,有 2 个变量和 .这里还有一个注释,说这是两者的别名,并且会根据某些预处理器选择其中之一。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
这篇Microsoft帖子说
根据您的首选项,可以显式调用 Unicode 函数(如 SetWindowTextW)或使用宏
那么到处使用并直接拨打可以吗?wchar_t
GetDriveTypeW
答:
早在 90 年代中期,您就有不支持 Unicode 的 Windows 95/98/ME 和支持 Unicode 的 NT4/2000/XP。您可以创建源代码,只需更改定义即可在有或没有 Unicode 支持的情况下进行编译。UNICODE
这种类型的代码如下所示:
UINT type = GetDriveType(TEXT("c:\\"));
没有名为 的函数,Windows 中 99% 的采用字符串参数的函数都有两个版本,在本例中为 和 。GetDriveType
GetDriveTypeA
GetDriveTypeW
在 Windows 头文件中,您有如下所示的代码:
#ifdef UNICODE
#define GetDriveType GetDriveTypeW
#else
#define GetDriveType GetDriveTypeA
#endif
如果在包含 windows.h 之前定义了 UNICODE,则上述代码将扩展为:
UINT type = GetDriveTypeW(L"c:\\");
如果没有:
UINT type = GetDriveTypeA("c:\\");
如今,大多数应用程序都应该使用 Unicode。你是应该使用 / 并直接调用还是仍然依赖定义是一个风格问题。在某些情况下,您可能需要强制执行 A 或 W 功能,这也没关系。wchar_t
WCHAR
GetDriveTypeW
这同样适用于带有宏和 _tcs 函数的 C 库,只是它们由定义控制。_TEXT
_UNICODE
如果收到有关不兼容字符串类型的警告,则表示调用了错误的函数,或者没有添加 (和 )。如果要编译用于 Unix 的跨平台代码,则在某些地方可能需要将 String 转换为宽字符串。#define UNICODE
_UNICODE
char*
另请参阅:
下一个:识别 SQL 表中的最新步骤序列
评论
TCHAR
wchar_t
TCHAR
_T(x)
_TEXT(x)
_T("C:\\Users\\")
TCHAR
wchar_t
L
GetDriveTypeW
GetDriveType