2013-05-31 9 views
-1

ребята, у меня есть это, чтобы ошибка и как я могу это исправить ?! , но до этого я говорю, что искал в сети и нашел решение для своей проблемы, такое как: свойства и перейдите в «Свойства конфигурации»> «Общие». Набор символов переключателя «Использовать многобайтовый набор символов». но также у меня такая же ошибка? !!ошибка C2664: 'MessageBoxA': невозможно преобразовать параметр 2 из 'const wchar_t [58]' в 'LPCSTR'

Ошибка-х:

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; 
} 
}; 
+0

MBCS не является Юникодом. MessageBoxA() - это не-Unicode-версия функции. Вы можете объявить массив как TEXT() или _T(). –

ответ

1

Вы используете широкие строковые литералы (L"..."), так что вы должны фактически использовать Unicode набор символов в Настройки проекта, о которых вы говорите. Это определит _UNICODE и сделайте все макросы имени функции Windows расширенными до широких символов (суффикс W).

Или, желательно, если вы знаете, что хотите использовать широкие строки, просто вызовите широкоформатные версии напрямую. То есть, используйте MessageBoxW вместо MessageBox и т. Д. Для других функций, специфичных для char.

+0

Хорошо, моя первая проблема решена, но как насчет второй ошибки ?! –

+0

@artines Не могли бы вы указать, на какой строке возникает ошибка, и дать полную ошибку (вы не указали ту часть, где указаны фактические аргументы шаблона)? – Angew

+0

с добавлением W в MessageBoxW (NULL, L "lol not do that", NULL, MB_ICONERROR); эта проблема линии решена ... но у меня есть еще 2 ошибки в строке 74, которые: if (! processName.compare (processInfo.szExeFile)) и строка 82: if (! processName.compare (processInfo.szExeFile)) и i adde сообщение об ошибке в первом сообщении: Ошибка 8 ошибки C2664: .... –

4

В настройках проекта вы не выбрали Юникод. Таким образом, у вас есть узкая версия WIN32 API. MessageBox сопоставляется с MessageBoxA, а в структуре информации процесса есть LPCSTR. Если вы измените настройки, они станут MessageBoxW и LPCWSTR, и код будет скомпилирован (или вы получите другие ошибки в другом месте).

Если вы хотите использовать эти версии A, используйте символ вместо wchar_t, вместо строки wstring вместо x "xxxx" вместо x "xxxx".

0

В свойствах проекта в Visual Studio перейдите в раздел «Конфигурационные параметры> C/C++> Препроцессор> Определения препроцессора и убедитесь, что UNICODE; определено. Это фиксировало для меня аналогичную ошибку.

Смежные вопросы