无法将参数1从'const char [5]'转换为'LPCTSTR'

时间:2015-04-22 14:20:23

标签: c++ visual-studio-2013 wav

我正在使用此代码项目: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)有关。

6 个答案:

答案 0 :(得分:5)

MSVC2013与之交互的原始字符串有两种。原始char字符串看起来像"Hello"wchar_t字符串看起来像L"World"

此外,如果您的项目使用wchar_tchar字符串,则会设置一个设置。宏TCHAR扩展为charwchar_t,宏_T("some text")将扩展为"some text"L"some text",具体取决于您的项目编译为使用charwchar_t

几乎每个采用字符串的Windows API都有一个宏包装它,将其映射到char版本或wchar_t版本。

所有这一切的目标是使编写单个应用程序成为可能,并使其具有广泛的字符识别能力。

Windows上的约定是窄字符char接口使用基于代码页的系统,而宽字符wchar_t接口使用UTF-16字符(OS中的子集UCS-2'在W2K之前,如果我阅读维基百科文章,那么XP中没有系统字体支持UCS-2之外的字符。

所有这一切的结束?您的项目已设置为使用宽字符串。这是一件好事,因为狭窄的字符构建的应用程序无法处理除一个字符代码页以外的任何内容。

因此,您的窄字符常量会产生错误,因为API现在期望广泛的字符常量。

简单的解决方法是将"raw strings"包裹在_T("raw string") _T宏中。在代码中使用char const*之类的内容时,请使用TCHAR const*

包含一个系统,以便对std::stringstd::cout以及其他基于char的{​​{1}}和其他图书馆执行相同的操作,或者在使用那些不与之交互的系统时用户和与Windows交谈时,使用std终止的接口为Achar终止基于W的字符串的接口函数。

现在很少见到"回去"在Windows上基于wchar_t的接口,因此一种方法是取消宏并直接与基于char的接口交互。您的字符串全部变为WL"wide character"内容全部为std等,您的字符变量全部为std::wstring。这可能不是最佳实践。

最后请注意,基于wchar_tchar的基于简称和广义的界面可以有多个wchar_tchar每个"字符" 。当支持的所有窗口都是来自UTF-16的单个wchar_t元素,并且多个wchar_t字符相对较少时,对于一个狭窄的窗口来说,这不是真的,所以很多代码都无法处理那种可能性。

答案 1 :(得分:4)

要将const char *转换为LPCTSTR类型,请在L之前添加const char *,如下所示:

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>

答案 2 :(得分:2)

SetWindowTextW()使用字符指向字符串的数据,其中字符串数据由常规字符组成,但您的函数很可能需要 unicode字符串,所以你不能直接输入字符串类型。您需要使用L"thisismystring"

答案 3 :(得分:0)

LPCTSTRcstring operator。我建议您在拨打setWindowTExt

的所有电话中执行此操作
setWindowText(_T("Record"))
如果编译器知道函数,

_T()将直接调用隐式强制转换(这里是这种情况)。你可以使用L"",感谢@Mgetzfor指出它。

答案 4 :(得分:0)

尝试在项目设置中使用多字节字符编码而不是Unicode。 对于VS2013,VS2015,您需要从此链接下载并安装Visual Studio的MBCS库https://www.microsoft.com/en-us/download/confirmation.aspx?id=40770

答案 5 :(得分:-4)

尝试这样的事情:

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