无法将参数 1 从 'const char [5]' 转换为 'LPCTSTR'
Cannot convert argument 1 from 'const char [5]' to 'LPCTSTR'
我正在使用这个代码项目:http://www.codeproject.com/Articles/10138/Voice-Recording-Playing-back-using-simple-classes
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText("Stop");
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText("Record");
}
}
但是我在很多地方都遇到了这个错误:
error C2664: 'void CWnd::SetWindowTextW(LPCTSTR)' : cannot convert argument 1 from 'const char [5]' to 'LPCTSTR'
我觉得跟我使用最新版visual studio(2013)有关系
SetWindowTextW()
将 字符指针指向字符串的数据 ,其中您的字符串数据由常规字符组成,但您的函数很可能需要 unicode string,所以不能直接输入字符串类型。您需要使用 L"thisismystring"
LPCTSTR
是一个 cstring operator。我建议您在所有拨打 setWindowTExt
的电话中都这样做
setWindowText(_T("Record"))
_T()
如果编译器知道该函数(这里就是这种情况),则将直接调用隐式转换。您也可以使用 L""
,感谢@Mgetz 指出。
尝试这样的事情:
char ch[5] = "test";
int num = MultiByteToWideChar(0,0,ch,-1,NULL,0);
wchar_t *wide = new wchar_t[num];
MultiByteToWideChar(0,0,ch,-1,wide,num);
要将 const char *
转换为 LPCTSTR
类型,请在 const char *
之前添加 L
,如下所示:
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText(L"Stop");
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText(L"Record");
}
}
或者你可以用 _T
莫名其妙地转换它,像这样:
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText(_T("Stop"));
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText(_T("Record"));
}
}
_T
宏来自 'tchar' 库,因此如果您还没有这样做,则需要 #include <tchar.h>
。
MSVC2013 交互的原始字符串有两种。原始 char
字符串看起来像 "Hello"
。 wchar_t
字符串看起来像 L"World"
.
此外,如果您的项目使用 wchar_t
或 char
字符串,还有一个设置。宏 TCHAR
扩展为 char
或 wchar_t
,宏 _T("some text")
将扩展为 "some text"
或 L"some text"
,具体取决于您的项目被编译为使用 char
或 wchar_t
.
几乎每个 windows API 字符串都有一个宏包装它,将其映射到 char
版本或 wchar_t
版本。
所有这一切的目标是使编写单个应用程序成为可能,并使其能够识别或不识别宽字符。
windows 上的约定是窄字符 char
接口使用基于代码页的系统,而宽字符 wchar_t
接口使用 UTF-16 字符(UCS- 2 在 OS 之前的 W2K 中,如果我正确阅读维基百科文章,则 XP 中的系统字体不支持 UCS-2 之外的字符。
这一切都结束了吗?您的项目已以某种方式设置为使用宽字符串。这是一件好事,因为窄字符构建的应用程序只能处理一个字符代码页。
所以您的窄字符常量会产生错误,因为 API 现在需要宽字符常量。
简单的解决方法是将所有 "raw strings"
包装在 _T("raw string")
和 _T
宏中。当您在代码中使用 char const*
等时,请改用 TCHAR const*
.
包含一个系统,用于对 std::string
和 std::cout
以及其他基于 char
的 std
和其他库执行相同的操作,或者在使用这些库时不与用户和与 windows 交谈时,对 char
使用 A
终止接口,或对基于 wchar_t
的字符串使用 W
终止接口函数。
现在很少有 "go back" 到 char
基于 windows 的接口,所以一种方法是取消宏,只与 [=39] 交互=] 直接基于接口。你的字符串都变成了 L"wide character"
,你的 std
都是 std::wstring
等等,你的字符变量都是 wchar_t
。这可能不是最佳做法。
最后,请注意 char
和 wchar_t
窄接口和宽接口都可以有多个 char
或 wchar_t
每个 "character"。当所有 windows 支持的都是来自 UTF-16 的单个 wchar_t
元素时,对于窄 window 来说情况并非如此,而多个 wchar_t
字符相对较少,因此许多代码无法处理这种可能性。
尝试在项目设置中使用多字节字符编码而不是 Unicode。
如果是 VS2013、VS2015,您需要从此 link https://www.microsoft.com/en-us/download/confirmation.aspx?id=40770
下载并安装 visual studio 的 MBCS 库
我正在使用这个代码项目:http://www.codeproject.com/Articles/10138/Voice-Recording-Playing-back-using-simple-classes
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText("Stop");
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText("Record");
}
}
但是我在很多地方都遇到了这个错误:
error C2664: 'void CWnd::SetWindowTextW(LPCTSTR)' : cannot convert argument 1 from 'const char [5]' to 'LPCTSTR'
我觉得跟我使用最新版visual studio(2013)有关系
SetWindowTextW()
将 字符指针指向字符串的数据 ,其中您的字符串数据由常规字符组成,但您的函数很可能需要 unicode string,所以不能直接输入字符串类型。您需要使用 L"thisismystring"
LPCTSTR
是一个 cstring operator。我建议您在所有拨打 setWindowTExt
setWindowText(_T("Record"))
_T()
如果编译器知道该函数(这里就是这种情况),则将直接调用隐式转换。您也可以使用 L""
,感谢@Mgetz 指出。
尝试这样的事情:
char ch[5] = "test";
int num = MultiByteToWideChar(0,0,ch,-1,NULL,0);
wchar_t *wide = new wchar_t[num];
MultiByteToWideChar(0,0,ch,-1,wide,num);
要将 const char *
转换为 LPCTSTR
类型,请在 const char *
之前添加 L
,如下所示:
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText(L"Stop");
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText(L"Record");
}
}
或者你可以用 _T
莫名其妙地转换它,像这样:
void CFisterDlg::OnRecord()
{
CString string;
m_RecButton.GetWindowText(string);
if(string == "Record")
{
StartRecordingToFile();
m_RecButton.SetWindowText(_T("Stop"));
}
else
{
StopRecordingToFile();
m_RecButton.SetWindowText(_T("Record"));
}
}
_T
宏来自 'tchar' 库,因此如果您还没有这样做,则需要 #include <tchar.h>
。
MSVC2013 交互的原始字符串有两种。原始 char
字符串看起来像 "Hello"
。 wchar_t
字符串看起来像 L"World"
.
此外,如果您的项目使用 wchar_t
或 char
字符串,还有一个设置。宏 TCHAR
扩展为 char
或 wchar_t
,宏 _T("some text")
将扩展为 "some text"
或 L"some text"
,具体取决于您的项目被编译为使用 char
或 wchar_t
.
几乎每个 windows API 字符串都有一个宏包装它,将其映射到 char
版本或 wchar_t
版本。
所有这一切的目标是使编写单个应用程序成为可能,并使其能够识别或不识别宽字符。
windows 上的约定是窄字符 char
接口使用基于代码页的系统,而宽字符 wchar_t
接口使用 UTF-16 字符(UCS- 2 在 OS 之前的 W2K 中,如果我正确阅读维基百科文章,则 XP 中的系统字体不支持 UCS-2 之外的字符。
这一切都结束了吗?您的项目已以某种方式设置为使用宽字符串。这是一件好事,因为窄字符构建的应用程序只能处理一个字符代码页。
所以您的窄字符常量会产生错误,因为 API 现在需要宽字符常量。
简单的解决方法是将所有 "raw strings"
包装在 _T("raw string")
和 _T
宏中。当您在代码中使用 char const*
等时,请改用 TCHAR const*
.
包含一个系统,用于对 std::string
和 std::cout
以及其他基于 char
的 std
和其他库执行相同的操作,或者在使用这些库时不与用户和与 windows 交谈时,对 char
使用 A
终止接口,或对基于 wchar_t
的字符串使用 W
终止接口函数。
现在很少有 "go back" 到 char
基于 windows 的接口,所以一种方法是取消宏,只与 [=39] 交互=] 直接基于接口。你的字符串都变成了 L"wide character"
,你的 std
都是 std::wstring
等等,你的字符变量都是 wchar_t
。这可能不是最佳做法。
最后,请注意 char
和 wchar_t
窄接口和宽接口都可以有多个 char
或 wchar_t
每个 "character"。当所有 windows 支持的都是来自 UTF-16 的单个 wchar_t
元素时,对于窄 window 来说情况并非如此,而多个 wchar_t
字符相对较少,因此许多代码无法处理这种可能性。
尝试在项目设置中使用多字节字符编码而不是 Unicode。 如果是 VS2013、VS2015,您需要从此 link https://www.microsoft.com/en-us/download/confirmation.aspx?id=40770
下载并安装 visual studio 的 MBCS 库