2014-11-20 3 views
4

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

Мой код:.

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

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

1 IntelliSense: no instance of constructor "CFileDialog::CFileDialog" matches the argument list argument types are: (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); 

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

+2

Это сборка UNICODE или MBCS? – PaulMcKenzie

+0

@PaulMcKenzie Я не уверен, как ответить на этот вопрос. Это чистая версия MFC-программы, это первый бит кода, который я ввел в обработчик событий file-> open – JayB

+0

@ user134788, префикс ваших строковых литералов с 'L' и повторите попытку. Вам придется изменить тип 'strFilter' на' WCHAR'. Если вы состоите в браке с идеей использования T-макросов, объедините ваши литералы с помощью '_T()' и используйте 'TCHAR' для типа' strFilter [] ' – WhozCraig

ответ

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. Если вы застряли, зная использовать указанные типы, вам было бы хорошо идти.

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

1

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

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

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

+1

. Еще одна вещь с TCHAR заключается в том, что вы не должны использовать' L "..." 'для строк или даже' '..." 'Вы должны использовать' _T ("...") '. Это связано с тем, что TCHAR может быть либо 'char', либо' WCHAR'. – rafeek

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