2017-02-02 21 views
0

Следующий код работает:«MessageBoxA»: не удается преобразовать параметр 2 из «станд :: вектор <_Ty>» к «» LPCSTR

void CMyPlugin8::myMessageBox(std::string& myString) 
{ 
    myString = "Received the following string\n" + myString; 
    char * writable = new char[myString.size() + 1]; 
    std::copy(myString.begin(), myString.end(), writable); 
    writable[myString.size()] = '\0'; // don't forget the terminating 0 "delete[] writable;" 

    int msgboxID = MessageBox(
     NULL, 
     writable, 
     "Notice", 
     MB_OK 
    ); 
    delete[] writable; 
} 

Для очистки автоматически я информацию из: How to convert a std::string to const char* or char*?.

Следующий код выдает ошибку:

void CMyPlugin8::myMessageBox(std::string& myString) 
{ 
    myString = "Received the following string\n" + myString; 
    std::vector<char> writable(myString.begin(), myString.end()); 
    writable.push_back('\0'); 

    int msgboxID = MessageBox(
     NULL, 
     writable, 
     "Notice", 
     MB_OK 
    ); 
} 

Я получаю эту ошибку: 'MessageBoxA': не удается преобразовать параметр 2 из 'станд :: вектор < _Ty>' на '' LPCSTR

+2

Почему вы скопировать в 'VECTOR'? (или вообще что-то копировать?) 'c_str' отлично подходит для этого случая. –

+0

Вы имели в виду, вероятно, означало 'writable.data()'. –

+0

Спасибо @ Франсуа, что работает. Не знаете, что вы имеете в виду при использовании c_str и как я это реализую. Я пробовал writeable.c_str(), и это дает другую ошибку 'c_str': не является членом 'std :: vector <_Ty>' –

ответ

2

MessageBox принимает const char*. Вам не нужно сначала копировать строку. Просто используйте c_str:

void CMyPlugin8::myMessageBox(std::string& myString) 
{ 
    myString = "Received the following string\n" + myString; 
    int msgboxID = MessageBox(
     NULL, 
     myString.c_str(), 
     "Notice", 
     MB_OK 
    ); 
} 

Обратите внимание, что я думаю, что ваш API беден. Вы изменяете значение строки, переданной в Обычно звонящий не будет ждать, что. Я думаю, что ваша функция должна выглядеть следующим образом, вместо:

void CMyPlugin8::myMessageBox(const std::string& myString) 
{ 
    std::string message = "Received the following string\n" + myString; 
    int msgboxID = MessageBox(
     NULL, 
     message.c_str(), 
     "Notice", 
     MB_OK 
    ); 
} 
+0

Пробовал последний вариант, который вы разместили выше. Я получаю сообщение об ошибке: | 'void CMyPlugin8 :: myMessageBox (const std :: string &)': перегруженная функция-член не найдена в 'CMyPlugin8' | –

+0

Вы не исправили файл заголовка. Параметр теперь 'const', чтобы он не мог быть изменен непреднамеренно. –

+0

Jackpot спасибо! Я думал, что что-то пропустил. Это работает –

4

Вы не можете передать вектор в качестве LPCSTR, вам необходимо. Использование:

&writable[0] 

или:

writable.data() 

вместо этого. Или просто используйте myString.c_str()

0
void CMyPlugin8::myMessageBox(const std::string& myString) 
{ 
    std::string message = "Received the following string\n" + myString; 
    int msgboxID = MessageBox(
     NULL, 
     message.c_str(), 
     "Notice", 
     MB_OK 
    ); 
} 

Спасибо всем & @Falcon

+0

Фактически изменение переданного в переменной не является хорошей идеей, я бы рекомендовал изменить его на 'const std :: string & myString', а внутренняя функция do' std :: string tmp = "received ........' Вам не нужен вектор здесь. Также, если вы когда-либо изменитесь на сборку UNICODE, вы обнаружите, что все ваши персонажи должны быть теперь wchar_t. – marcinj