How to use generic function GetDriveType

  ansi, c++, unicode, windows

I have a C app that I need to compile in Windows. And I am really unable to wrap my head around the UNICODE and ANSI concept in Windows

I want to use GetDriveType function and there are 2 variables A and W. There is also a note here saying that GetDriveType is an alias to both and will select either based on some pre-processor.

But how should I call this function ?

This is what I am trying:

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: %sn", win_path);

driveType = GetDriveType(win_path);
wprintf(L"Drive type is: %dn", driveType);
if (driveType == DRIVE_FIXED)
return 0;

It produces the result

Checking path: C:Users
Drive type is: 1

If I replace GetDriveType with GetDriveTypeA it returns the correct value 3 and succeeds.

I tried another variant too

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);

I see this warning:

'function' : incompatible types - from 'wchar_t *' to 'LPCSTR'

So, which one to use ? How is it generic ? The path I will be reading is from an environment variable on Windows

What is TCHAR and wchar_t etc. ? I found this post, but could not understand much

Source: Windows Questions