2014-09-08 4 views
0

Я пишу приложение Win32 с Awesomium. Согласно разделу учебника я могу загрузить локальный файл на мой взгляд:Как создать WebURL из std :: wstring?

WebURL url(WSLit("file:///C:/dev/project/util/ui/index.html")); 
view_->web_view()->LoadURL(url); 

Это работает как ожидалось.

Когда я пытаюсь передать std::wstring к WSList функции:

std::wstring ui_path = L"file:///" + install_path + L"/util/ui/index.html"; 
WebURL url(WSLit(ui_path)); 
view_->web_view()->LoadURL(url); 

Я получаю ошибку компиляции:

src/main.cc(52) : error C2664: 'Awesomium::WSLit' : cannot convert parameter 1 from 'std::wstring' to 'const char *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Когда я пытаюсь передать WSLit(ui_path.c_str()) компилятор бросает другую ошибку:

src/main.cc(52) : error C2664: 'Awesomium::WSLit' : cannot convert parameter 1 from 'const wchar_t *' to 'const char *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Что такое правильный способ конвертации это до const char * типа?

Edit:

От Awesomium документация:

WSLit() is a special helper function that lets you declare WebString literals. Most of our API uses UTF-16 strings (wrapped with WebString) but we added WSLit() so you can declare ASCII C-strings with minimal fuss.

+0

Какую кодировку символов ожидает «WSLit» Awesomium? – IInspectable

+1

Возможно ли даже, что вы можете столкнуться с данными без ASCII? Если да, вам все равно, что происходит? –

+0

Быстрый Google показывает, что вы, вероятно, должны использовать 'WebString' со строками Unicode, например. 'URL WebURL (WebString (ui_path.c_str())). –

ответ

2

WSLit предназначен для создания объекта WebString из строки ASCII. Поскольку вы не хотите создавать WebString из ASCII, но, скорее, имеете строку UNICODE с самого начала, вам просто не нужно использовать WSLit.

Следующая строка кода строит WebURL из std::wstring:

WebURL url(WebString(ui_path.c_str())); 

Как отметил Реми Лебо это не может составить для любого данного компилятора или компилятора настроек. WebString имеет конструктор explicit, принимающий const wchar16*. Platform.h определяет wchar16, как

typedef unsigned short wchar16; 

В зависимости от настроек компилятора и компилятора, это может или не может быть такой же, как wchar_t. При компиляции с компилятором Microsoft с использованием опции командной строки /Zc:wchar_t, wchar_t интерпретируется как собственный тип данных.Это другой тип из unsigned short, и явный конструктор WebString требует дополнительного бросания:

WebURL url(WebString(reinterpret_cast<const wchar16*>(ui_path.c_str()))); 

Косвенно вызывающего конструктор преобразования WebString, используя следующий синтаксис не представляется возможным, так как он объявлен explicit:

WebURL url(reinterpret_cast<const wchar16*>(ui_path.c_str())); 
+0

Это приводит к ошибке компилятора: src/main.cc (53): ошибка C2248: «Awesomium :: WebURL :: WebURL»: не может получить доступ к частному члену, объявленному в классе «Awesomium»: WebURL ' – Alexander

+0

Вам рекомендуется добавьте соответствующие директивы '# include'. Если ваш компилятор не смог создать временный объект 'WebString' из' const wchar_t * ', будьте явным. Я обновил ответ. – IInspectable

+1

'std :: wstring :: c_str()' возвращает 'const wchar_t *', но 'WebString' не имеет конструктора, который принимает вход' wchar_t * '. У этого есть конструктор, который принимает 'const wchar16 *' вместо этого, но 'wchar16' является typedef для' unsigned short', поэтому вам нужен тип-cast: 'WebURL url (WebString ((const wchar16 *) ui_path.c_str())); или просто: 'WebURL url ((const wchar16 *) ui_path.c_str());' –

-2

Если вопрос "преобразовать зЬй :: wstring к сопзЬ полукокса *", я обычно использую эту функцию и она отлично работает :

std::string wstringToString(const std::wstring& in){ 
    std::string result(in.begin(), in.end()); 
    return result; 
} 

А затем вы можете получить char* по телефону result.c_str();

+1

Uhm .... это не преобразует данные. Он искажает данные. – IInspectable

+1

, пожалуйста, можете ли вы поделиться своей мудростью и сообщить мне, как это искажает данные? –

+1

Любой символ, который не является символом ASCII в исходной строке, будет искажен. – IInspectable

-2

Попробуйте это:

std::wstring ui_path = L"file:///" + install_path + L"/util/ui/index.html"; 
std::string cui_path(ui_path.begin(), ui_path.end()); 
WebURL url(WSLit(cui_path)); 
view_->web_view()->LoadURL(url); 

Однако, ИМХО, если Awesomium предназначен для запуска под Windows, конструктор WSLit должен поддерживать как зЬй :: wstring или wchar_t *.

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

  • Нет связанных вопросов^_^