Передайте std :: string в API-интерфейс WriteConsole - PullRequest
0 голосов
/ 24 февраля 2020

Когда я компилирую и связываю следующую программу, она не показывает никаких проблем.

#include <Windows.h>
#include <iostream>

int main(int argc, const char* argv)
{
    std::string cMessage = "Native Windows Development.\n";
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), cMessage.c_str(), cMessage.size(), NULL, NULL);

    return 0;
}

Но когда я запускаю программу, она показывает мне кучу ????? войдите в консоль. в чем проблема с кодом? Почему я не могу использовать std :: string вместо const char *?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Вывод ? указывает, что вы компилируете для Unicode, где WriteConsole() соответствует WriteConsoleW(). Поскольку вы хотите записать char данные, используйте WriteConsoleA() вместо:

#include <Windows.h>
#include <iostream>

int main(int argc, const char* argv)
{
    std::string cMessage = "Native Windows Development.\n";
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), cMessage.c_str(), cMessage.size(), NULL, NULL);

    return 0;
}
0 голосов
/ 24 февраля 2020

По умолчанию набор символов - Unicode, поэтому WriteConsole ожидает строку wchar. У вас есть два варианта.

1) Делать все в юникоде

int main(int argc, const char* argv)
{
    std::wstring cMessage = L"Native Windows Development.\n";
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), cMessage.c_str(), cMessage.size(), NULL, NULL);

    return 0;
}

2) Установить набор символов по умолчанию mbcs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...