Проблемы с реализацией CFileDialog

Я следую за определением для CFileDialog, но VS2013 все еще говорит мне, что для аргументов, которые я передаю, нет конструктора.

Мой код:

CFile theFile;
char strFilter[] = { "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" };
CFileDialog fDlg = CFileDialog(TRUE, ".txt", NULL, 0, strFilter);

Результирующая ошибка:

1 IntelliSense: ни один экземпляр конструктора «CFileDialog :: CFileDialog» не соответствует списку аргументов
Типы аргументов: (int, const char [5], int, int, char [46]) c: \ Users \ Jonathan \ Documents \ Visual Studio 2013 \ Projects \ SDI \ SDI \ MainFrm.cpp 131 21 SDI

И CFileDialog конструктор для справки:

explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE);

В чем проблема?

4

Решение

Кажется, проблема в том, что вы используете неверный тип строки.

Быстрое решение заключается в использовании TCHAR и не char, Лучшее решение состоит в том, чтобы просто использовать широкие строки и убедиться, что сборка Unicode.

Когда вы создаете проект в Visual Studio, типом набора символов по умолчанию, который используется, является Unicode, а не MBCS и не «Not Set». Это означает, что функции Windows API и MFC, которые принимают символьные массивы и указатели, будут использовать широкие символы. Поэтому с помощью char, char *, const char*в Windows API функции, которые ожидают, что широкие строки не будут компилироваться.

Признак того, что ваш код неверен, даже если вы ничего не знали о Unicode или MBCS, заключается в том, что вызываемые вами функции принимают типы LPCTSTR — то есть не const char *это то, что он есть, а именно постоянный указатель на TCHAR, Если вы застряли в знании использовать указанные типы, вам было бы хорошо.

Таким образом, урок заключается в том, что если функция хочет тип, предоставьте переменную или выражение этого типа, а не то, что, по вашему мнению, эквивалентно типу.

4

Другие решения

Хорошо. Поэтому я изменил свой код на следующее:

CFile theFile;
TCHAR strFilter[] = { _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||") };
CFileDialog fDlg = CFileDialog(TRUE, _T(".txt"), NULL, 0, strFilter);

И теперь нет проблем. Спасибо за ваши ответы!

1