Как преобразовать аргумент из std::string в LPCWSTR

803
13 ноября 2017, 21:25

Кусок кода для проверки интернет соединения:

#include <Wininet.h>
#pragma comment(lib, "wininet.lib")
bool CheckConnection(const std::string InternetLink)
{
    if (!InternetCheckConnectionW(InternetLink.c_str, FLAG_ICC_FORCE_CONNECTION, 0))
    return 0;
        return 1;
}

Мне выдаёт ошибку: не существует подходящей функции преобразования из "const std::string" в "LPCWSTR

Затем хотел вызвать её примерно так:

is(!CheckConnection("http://google.com") {...}
Answer 1

LPCWSTR — это Unicode-строка. В C++ её аналогом является std::wstring (обратите внимание на префикс w).

Используемый же вами std::string — это строка в однобайтной кодировке, и её можно преобразовать максимум в LPCSTR.

Соответственно, вам нужно использовать не Юникодный InternetCheckConnectionW(), а однобайтносимвольный InternetCheckConnectionA().

Answer 2

Чтобы не приходилось делать лишних преобразований строк, можно пользоваться таким нехитрым макросом:

#if defined(UNICODE)
    #define _tstring wstring
#else
    #define _tstring string
#endif

Теперь, в проекте замените все std::string на std::_tstring. И Вам уже не придется конвертировать строки на ровном месте. В STL есть и другие сюрпризы для winapi (например to_string/to_wstring). Это решение подходит и для них.

То же самое касается A/W, @AnT прав: не надо явно вызывать InternetCheckConnectionA или InternetCheckConnectionW, если у Вас на то нет особых требований (а судя по коду, их нет). Вызывайте InternetCheckConnection без постфиксов.

И не забывайте про текстовый помошник в windows - макрос TEXT или _T. Правильный вызов CheckConnection такой:

is(!CheckConnection(TEXT("http://google.com")) {...}
Answer 3

гляньте тута: Конвертация std::string в std::wstring

да и передавать в функцию лучше наверно не const std::string, а const std::string&

READ ALSO
Что возвращает GetModuleHandle(NULL)

Что возвращает GetModuleHandle(NULL)

Необходимо получить адрес начала PE-заголовка в памятиИспользую данный код:

264
Qt Widgets. Форматирование текста.

Qt Widgets. Форматирование текста.

Есть функция, которая при выводе текста на виджет Textedit (chat_edit), выравнивает его по левому краю через Qt::AlignLeftЯ хочу, чтоб, когда я получу текст,...

281
Палиндром - ошибка

Палиндром - ошибка

Программа должна проверять строку на палиндромНе понимаю , в чем ошибка

232
Ошибка undefined reference to + list&lt;T&gt;::iterator it? [дубликат]

Ошибка undefined reference to + list<T>::iterator it? [дубликат]

На данный вопрос уже ответили:

281