错误C2664:'MessageBoxA':无法将参数2从'const wchar_t [58]'转换为'LPCSTR'

时间:2013-05-31 17:42:02

标签: c++

伙计们,我有这个错误以及如何解决这个问题?! 但在此之前我说我在网上搜索并找到我的问题的解决方案,如:  属性,然后导航到配置属性>一般。将字符集切换为“使用多字节字符集”。 但我也有同样的错误?!!

错误:

Error   7   error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'const wchar_t [58]' to 'LPCSTR'   

Error   8   error C2664: 'int std::basic_string<_Elem,_Traits,_Ax>::compare(const std::basic_string<_Elem,_Traits,_Ax> &) const' : cannot convert parameter 1 from 'CHAR [260]' to 'const std::basic_string<_Elem,_Traits,_Ax> &'   

我的代码是:

#include "StdInc.h"
#include<fstream>
#include<sstream>
#include<string>
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<Windows.h>
#include<TlHelp32.h>

using std::ifstream;
using std::string;
using std::getline;
using std::ios;
using std::cerr;
using std::cout;
using std::endl;
using std::fixed;
using std::left;
using std::right;
using std::showpoint;
using std::cin;

class check {

public :


void check_seta () {

    ifstream cfgm2("finfin.cfg",ios::in);

    string cfgLine;

    while (getline(cfgm2,cfgLine)) {

        if (string::npos != cfgLine.find("seta mamamia")){

             if (cfgLine.at(19) == '0'){

                 MessageBox(NULL , L"lol not do that",NULL,MB_ICONERROR); 

                 std::wstring Processname(L"mod.exe");

                 DWORD ProcessId = FindProcessId(Processname);

                 HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE ,ProcessId);

                 TerminateProcess(pHandle,0);

                 CloseHandle(pHandle);
             }
             break;
        }

    }
}

DWORD FindProcessId(const std::wstring& processName)
    {
    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);

    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if ( processesSnapshot == INVALID_HANDLE_VALUE )
    return 0;

    Process32First(processesSnapshot, &processInfo);
    if ( !processName.compare(processInfo.szExeFile) )
    {
        CloseHandle(processesSnapshot);
        return processInfo.th32ProcessID;
    }

    while ( Process32Next(processesSnapshot, &processInfo) )
    {
        if ( !processName.compare(processInfo.szExeFile) )
        {
            CloseHandle(processesSnapshot);
            return processInfo.th32ProcessID;
        }
    }

    CloseHandle(processesSnapshot);
    return 0;
}
};

3 个答案:

答案 0 :(得分:4)

在项目设置中,您没有选择Unicode。所以你有WIN32 API的缩小版本。 MessageBox映射到MessageBoxA,进程信息结构中包含LPCSTR。如果您更改设置,那么它们将成为MessageBoxW和LPCWSTR,代码将被编译(或者您在其他地方获得其他错误)。

如果您打算使用A版本,请使用char而不是wchar_t,而不是使用字符串而不是wstring,“xxx”而不是L“xxxx”。

答案 1 :(得分:1)

您正在使用宽字符串文字(L"..."),因此您必须在您提到的项目设置中实际使用 Unicode 字符集。这将定义_UNICODE并使所有Windows函数名宏扩展为宽字符变体(后缀W)。

或者,最好,如果您知道要使用宽字符串,只需直接调用wide-char版本即可。也就是说,对其他特定于字符宽度的函数使用MessageBoxW而不是MessageBox等。

答案 2 :(得分:0)

在Visual Studio的项目属性中,转到配置设置&gt; C / C ++&gt;预处理器&gt;预处理器定义并确保UNICODE;被定义为。这为我解决了类似的错误。