首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用泛型函数GetDriveType

如何使用泛型函数GetDriveType
EN

Stack Overflow用户
提问于 2021-12-15 15:49:39
回答 1查看 134关注 0票数 0

我有一个C应用程序,需要在Windows中编译。我真的无法理解UNICODEANSIWindows中的概念

我想使用GetDriveType函数,其中有两个变量AW。还有一个注释这里说,GetDriveType是两者的别名,并将根据某些预处理器进行选择。

但是我该怎么称呼这个函数呢?

这就是我想要做的:

代码语言:javascript
复制
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;

它产生的结果

代码语言:javascript
复制
Checking path: C:\Users\
Drive type is: 1
Failure

如果我用GetDriveType替换GetDriveTypeA,它返回正确的值3并成功。

我也试过另一种变体

代码语言:javascript
复制
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);

我看到了这样的警告:

代码语言:javascript
复制
'function' : incompatible types - from 'wchar_t *' to 'LPCSTR'

那么,用哪一种呢?它怎么是通用的?我将读取的路径来自Windows上的一个环境变量

TCHARwchar_t等是什么?我找到了这个帖子,但不太懂

这个微软帖子

根据您的偏好,您可以显式地调用Unicode函数,例如SetWindowTextW,或者使用宏。

所以,可以在任何地方使用wchar_t并直接调用GetDriveTypeW吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-15 23:32:38

在90年代中期,Windows 95/98/ME不支持Unicode,NT4/2000/XP则支持Unicode。您可以通过更改UNICODE定义来创建可以编译或不支持Unicode的源代码。

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

代码语言:javascript
复制
UINT type = GetDriveType(TEXT("c:\\"));

没有名为GetDriveType的函数,在Windows中接受字符串参数的所有函数中,99%有两个版本,本例中为GetDriveTypeAGetDriveTypeW

在Windows头文件中,有如下代码:

代码语言:javascript
复制
#ifdef UNICODE
#define GetDriveType GetDriveTypeW
#else
#define GetDriveType GetDriveTypeA
#endif

如果UNICODE是在包含windows.h之前定义的,则上面的代码展开为:

代码语言:javascript
复制
UINT type = GetDriveTypeW(L"c:\\");

如果没有,则:

代码语言:javascript
复制
UINT type = GetDriveTypeA("c:\\");

如今,大多数应用程序都应该使用Unicode。您应该使用wchar_t/WCHAR并直接调用GetDriveTypeW还是仍然依赖定义,这是一个风格问题。在某些情况下,您也需要强制使用A或W函数和那没什么

这同样适用于具有_TEXT宏和_tcs函数的C库,但它们是由_UNICODE定义控制的。

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

另请参阅:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70366570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档