无法将参数 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_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 字符(UCS- 2 在 OS 之前的 W2K 中,如果我正确阅读维基百科文章,则 XP 中的系统字体不支持 UCS-2 之外的字符。

这一切都结束了吗?您的项目已以某种方式设置为使用宽字符串。这是一件好事,因为窄字符构建的应用程序只能处理一个字符代码页。

所以您的窄字符常量会产生错误,因为 API 现在需要宽字符常量。

简单的解决方法是将所有 "raw strings" 包装在 _T("raw string")_T 宏中。当您在代码中使用 char const* 等时,请改用 TCHAR const*.

包含一个系统,用于对 std::stringstd::cout 以及其他基于 charstd 和其他库执行相同的操作,或者在使用这些库时不与用户和与 windows 交谈时,对 char 使用 A 终止接口,或对基于 wchar_t 的字符串使用 W 终止接口函数。

现在很少有 "go back" 到 char 基于 windows 的接口,所以一种方法是取消宏,只与 [=39] 交互=] 直接基于接口。你的字符串都变成了 L"wide character",你的 std 都是 std::wstring 等等,你的字符变量都是 wchar_t。这可能不是最佳做法。

最后,请注意 charwchar_t 窄接口和宽接口都可以有多个 charwchar_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 库