Ошибка C2440: '=': невозможно преобразовать из 'const char *' в 'LPCWSTR'

Я новичок в использовании Visual Studio и нужно скомпилировать приложение, но я получаю сообщение об ошибке: error C2440: '=': cannot convert from 'const char *' to 'LPCWSTR' онлайн:

std::string open_file_dialog(
    std::string title,
    std::string filter)
{
    char filename[MAX_PATH];

    OPENFILENAME ofn;
    ZeroMemory(&filename, sizeof(filename));
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = filter.c_str();
    ofn.lpstrFile = filename;

Я считаю, что это может иметь отношение к настройкам моего проекта, так как исходный код, на который я смотрю, должен скомпилироваться как есть. Однако я не уверен на 100%. Может кто-нибудь помочь мне здесь?

2 ответа

Решение

Что вам нужно знать о Windows API, так это то, что он поставляется в двух вариантах: UNICODE и не- UNICODE.

Когда вы включаете windows.h

выбранный вкус зависит от того, определен ли UNICODE.

Многие, если не большинство структур и функций WINAPI - это просто макросы, которые в основном просто добавляют W или A к имени макроса, чтобы получить реальное имя того, что вы хотите.

Аромат UNICODE требует типов символов wchar_t и не-Юникод принимает char типы (или указатели на них).

Таким образом, вы должны либо использовать не-макро имена для структур и / или функций, либо настроить использование типов в соответствии с требуемым макроопределением (в вашем случае используйте std::wstring вместо std::string).

Вы, вероятно, активировали UNICODE так OPENFILENAME становится OPENFILENAMEWне OPENFILENAMEA вот почему ваш ofn.lpstrFilter = filter.c_str(); выходит из строя.

lpstrFilter это wchar_t* в W версия.

Вы, вероятно, должны придерживаться UNICODE и перейти на использование std::wstrings, который дает вам лучший доступ к WinAPI. Некоторые функции работают по-другому (хуже) в A (Анси) режим.

Другие вопросы по тегам