如何使用泛型函数 GetDriveType

How to use generic function GetDriveType

提问人:mittal 提问时间:12/15/2021 最后编辑:Thomas Dickeymittal 更新时间:5/24/2023 访问量:258

问:

我有一个 C 应用程序,我需要在 .我真的无法把我的脑袋包裹在和概念上WindowsUNICODEANSIWindows

我想使用函数,有 2 个变量和 .这里还有一个注释,说这是两者的别名,并且会根据某些预处理器选择其中之一。GetDriveTypeAWGetDriveType

但是我应该如何调用这个函数呢?

这就是我正在尝试的:

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

如果我用它替换,则返回正确的值并成功。GetDriveTypeGetDriveTypeA3

我也尝试了另一种变体

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 上的环境变量

什么是等等?我找到了这篇文章,但无法理解太多TCHARwchar_t

这篇Microsoft帖子

根据您的首选项,可以显式调用 Unicode 函数(如 SetWindowTextW)或使用宏

那么到处使用并直接拨打可以吗?wchar_tGetDriveTypeW

C Windows WinAPI Unicode ANSI

评论

1赞 Ian Abbott 12/16/2021
是的,你可以忽略这些东西,到处使用。但是,如果您确实使用字符串文字,则需要用 or 宏包装,例如 .如果为 ,则会在字符串文字前面加上前缀。TCHARwchar_tTCHAR_T(x)_TEXT(x)_T("C:\\Users\\")TCHARwchar_tL
0赞 mittal 12/16/2021
所以基本上我的代码的第二个版本就可以了吗?我应该用代替?为什么它会发出警告?GetDriveTypeWGetDriveType

答:

2赞 Anders 12/16/2021 #1

早在 90 年代中期,您就有不支持 Unicode 的 Windows 95/98/ME 和支持 Unicode 的 NT4/2000/XP。您可以创建源代码,只需更改定义即可在有或没有 Unicode 支持的情况下进行编译。UNICODE

这种类型的代码如下所示:

UINT type = GetDriveType(TEXT("c:\\"));

没有名为 的函数,Windows 中 99% 的采用字符串参数的函数都有两个版本,在本例中为 和 。GetDriveTypeGetDriveTypeAGetDriveTypeW

在 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_tWCHARGetDriveTypeW

这同样适用于带有宏和 _tcs 函数的 C 库,只是它们由定义控制。_TEXT_UNICODE

如果收到有关不兼容字符串类型的警告,则表示调用了错误的函数,或者没有添加 (和 )。如果要编译用于 Unix 的跨平台代码,则在某些地方可能需要将 String 转换为宽字符串。#define UNICODE_UNICODEchar*

另请参阅: