Ошибка 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::wstring
s, который дает вам лучший доступ к WinAPI. Некоторые функции работают по-другому (хуже) в A
(Анси) режим.