"LPCWSTR" 类型的参数与 "LPCSTR" 类型的参数不兼容
Argument of type "LPCWSTR" is incompatible of the parameter of type "LPCSTR"
有人能告诉我为什么会出现错误吗?我一直在尝试解决这个问题。
LPCWSTR drive2[4] = { L"C:\", L"D:\", L"E:\", L"F:\" };
int i;
UINT test;
for (i = 0; i<12; i++)
{
test = GetDriveType(drive2[i]); //anything from here with "drive2[i]" is an error.
switch (test)
{
case 0: ::MessageBox(Handle, drive2[i], "0 cannot be determined", MB_OK);
break;
case 1: ::MessageBox(Handle, drive2[i], "1 invalid", MB_OK);
break;
case 2: ::MessageBox(Handle, drive2[i], "2 removable", MB_OK);
break;
case 3: ::MessageBox(Handle, drive2[i], "3 fixed", MB_OK);
break;
default: "Unknown value!\n";
谢谢!
LPCSTR
是const char*
,而LPCWSTR
是const wchar_t*
,不兼容
C++ 中的宽字符串声明:
LPCWSTR string = L"Wide string";
常规字符串:
LPCSTR string = "Regular string";
如果你想使用宽字符串,你需要使用 W
版本,在你的情况下,使用 GetDriveTypeW
.
请注意 GetDriveType
不是函数,它是一个宏,如果您的代码以 ASCII 模式(默认)编译,则扩展为 GetDriveTypeA
,但扩展为 GetDriveTypeW
如果代码以 UNICODE 模式编译
LPCWSTR
是 const wchar_t*
.
的别名
您正在使用 TCHAR
版本的 GetDriveType()
和 MessageBox()
函数。如果 UNICODE
在编译时定义,TCHAR
映射到 wchar_t
,否则它映射到 char
.
你的 drive2
变量是一个 wchar_t
指针数组,所以为了将 drive2[i]
按原样传递给 GetDriveType()
和 MessageBox()
,你必须为 Unicode 编译项目(即,在编译时定义 UNICODE
条件),这将使 GetDriveType()
映射到 GetDriveTypeW()
and MessageBox()
map to MessageBoxW()
so that they accept only wide (wchar_t
) strings. Otherwise, GetDriveType()
will map to GetDriveTypeA()
and MessageBox()
will map to MessageBoxA()
,因此它们只接受 缩小 (char
) 个字符串。
您正在将 narrow 字符串文字传递给 MessageBox()
,这在为 Unicode 编译时不起作用。如果您不针对 Unicode 进行编译,则不能将 wide 字符串传递给 TCHAR
函数 - 这听起来像您的情况,因为错误消息抱怨传递const wchar_t*
指向 const char*
参数的指针。
当定义 UNICODE
时,您需要使用 TEXT()
宏来使字符串文字 wide 而不是 narrow .
我还建议您也对 drive2
数组中的字符串文字使用 TEXT()
,以匹配您将数组元素传递给的 TCHAR
函数。
此外,您的循环超出了 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 string仅文字,根本不处理 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;
}
}
有人能告诉我为什么会出现错误吗?我一直在尝试解决这个问题。
LPCWSTR drive2[4] = { L"C:\", L"D:\", L"E:\", L"F:\" };
int i;
UINT test;
for (i = 0; i<12; i++)
{
test = GetDriveType(drive2[i]); //anything from here with "drive2[i]" is an error.
switch (test)
{
case 0: ::MessageBox(Handle, drive2[i], "0 cannot be determined", MB_OK);
break;
case 1: ::MessageBox(Handle, drive2[i], "1 invalid", MB_OK);
break;
case 2: ::MessageBox(Handle, drive2[i], "2 removable", MB_OK);
break;
case 3: ::MessageBox(Handle, drive2[i], "3 fixed", MB_OK);
break;
default: "Unknown value!\n";
谢谢!
LPCSTR
是const char*
,而LPCWSTR
是const wchar_t*
,不兼容
C++ 中的宽字符串声明:
LPCWSTR string = L"Wide string";
常规字符串:
LPCSTR string = "Regular string";
如果你想使用宽字符串,你需要使用 W
版本,在你的情况下,使用 GetDriveTypeW
.
请注意 GetDriveType
不是函数,它是一个宏,如果您的代码以 ASCII 模式(默认)编译,则扩展为 GetDriveTypeA
,但扩展为 GetDriveTypeW
如果代码以 UNICODE 模式编译
LPCWSTR
是 const wchar_t*
.
您正在使用 TCHAR
版本的 GetDriveType()
和 MessageBox()
函数。如果 UNICODE
在编译时定义,TCHAR
映射到 wchar_t
,否则它映射到 char
.
你的 drive2
变量是一个 wchar_t
指针数组,所以为了将 drive2[i]
按原样传递给 GetDriveType()
和 MessageBox()
,你必须为 Unicode 编译项目(即,在编译时定义 UNICODE
条件),这将使 GetDriveType()
映射到 GetDriveTypeW()
and MessageBox()
map to MessageBoxW()
so that they accept only wide (wchar_t
) strings. Otherwise, GetDriveType()
will map to GetDriveTypeA()
and MessageBox()
will map to MessageBoxA()
,因此它们只接受 缩小 (char
) 个字符串。
您正在将 narrow 字符串文字传递给 MessageBox()
,这在为 Unicode 编译时不起作用。如果您不针对 Unicode 进行编译,则不能将 wide 字符串传递给 TCHAR
函数 - 这听起来像您的情况,因为错误消息抱怨传递const wchar_t*
指向 const char*
参数的指针。
当定义 UNICODE
时,您需要使用 TEXT()
宏来使字符串文字 wide 而不是 narrow .
我还建议您也对 drive2
数组中的字符串文字使用 TEXT()
,以匹配您将数组元素传递给的 TCHAR
函数。
此外,您的循环超出了 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 string仅文字,根本不处理 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;
}
}