LPCWSTR
- псевдоним для const wchar_t*
.
Вы используете TCHAR
версию функций GetDriveType()
и MessageBox()
. TCHAR
отображается на wchar_t
, если UNICODE
определен во время компиляции, в противном случае он отображается на char
.
Ваша переменная drive2
является массивом wchar_t
указателей, поэтому по порядку чтобы передать drive2[i]
как есть на GetDriveType()
и MessageBox()
, вы должны скомпилировать свой проект для Unicode (ie, сделать условное UNICODE
определенным во время компиляции), что сделает GetDriveType()
сопоставить с GetDriveTypeW()
и MessageBox()
сопоставить с MessageBoxW()
, чтобы они принимали только строки wide (wchar_t
). В противном случае GetDriveType()
будет отображаться на GetDriveTypeA()
, а MessageBox()
будет отображаться на MessageBoxA()
, поэтому они принимают только узкие (char
) строки .
Вы передаете узкие строковые литералы в MessageBox()
, которые не будут работать при компиляции для Unicode. И вы не можете передавать строки wide в функции TCHAR
, если вы НЕ компилируете для Unicode - что звучит так, как в вашей ситуации, так как сообщение об ошибке жалуется на передачу указателя const wchar_t*
на параметр const char*
.
Вам нужно использовать макрос TEXT()
, чтобы строковые литералы были шириной , когда определено UNICODE
, а не узкий .
Я бы также предложил использовать TEXT()
для строковых литералов в вашем массиве drive2
, чтобы соответствовать TCHAR
функциям, которым вы передаете элементы массива.
Кроме того, ваш l oop выходит за границы массива drive2
.
С учетом сказанного попробуйте следующее:
LPCTSTR drive2[4] = { TEXT("C:\\"), TEXT("D:\\"), TEXT("E:\\"), TEXT("F:\\") };
int i;
UINT test;
for (i = 0; i < 4; i++)
{
test = GetDriveType(drive2[i]);
switch (test)
{
case 0:
::MessageBox(Handle, drive2[i], TEXT("0 cannot be determined"), MB_OK);
break;
case 1:
::MessageBox(Handle, drive2[i], TEXT("1 invalid"), MB_OK);
break;
case 2:
::MessageBox(Handle, drive2[i], TEXT("2 removable"), MB_OK);
break;
case 3:
::MessageBox(Handle, drive2[i], TEXT("3 fixed"), MB_OK);
break;
default:
::MessageBox(Handle, drive2[i], TEXT("Unknown value!"), MB_OK);
break;
}
}
В противном случае, если вы хотите иметь дело исключительно с wchar_t
(что и должно быть), затем напрямую использовать определения функций на основе Unicode и использовать только строковые литералы wide , вообще не иметь дело с TCHAR
:
LPCWSTR drive2[4] = { L"C:\\", L"D:\\", L"E:\\", L"F:\\" };
int i;
UINT test;
for (i = 0; i < 4; i++)
{
test = GetDriveTypeW(drive2[i]);
switch (test)
{
case 0:
::MessageBoxW(Handle, drive2[i], L"0 cannot be determined", MB_OK);
break;
case 1:
::MessageBoxW(Handle, drive2[i], L"1 invalid", MB_OK);
break;
case 2:
::MessageBoxW(Handle, drive2[i], L"2 removable", MB_OK);
break;
case 3:
::MessageBoxW(Handle, drive2[i], L"3 fixed", MB_OK);
break;
default:
::MessageBoxW(Handle, drive2[i], L"Unknown value!", MB_OK);
break;
}
}