CFileDialog实例化的问题

Jay*_*ayB 4 c++ mfc cfiledialog

我正在遵循这个定义CFileDialog,但VS2013仍然告诉我没有构造函数可用于我传入的参数.

我的代码:

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

结果错误:

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);
Run Code Online (Sandbox Code Playgroud)

有什么问题?

Pau*_*zie 5

问题似乎是您使用的字符串类型不正确.

快速解决方案是使用TCHAR而不是char.更好的解决方案是只使用宽字符串并确保构建是Unicode.

在Visual Studio中创建项目时,使用的默认字符集类型是Unicode,而不是MBCS,而不是"未设置".这意味着采用字符数组和指针的Windows API和MFC函数将使用宽字符.因此,使用char,char *,const char*,对期待宽字符串不会编译Windows API函数.

即使您对Unicode或MBCS一无所知,您的代码错误的指示是您正在调用的函数采用的类型LPCTSTR- 不是 a const char *,它就是它,即指向a的常量指针TCHAR.如果您不知道如何使用指定的类型,那么您将会很高兴.

因此,经验教训是,如果函数需要一个类型,请提供该类型的变量或表达式,而不是您认为该类型相当于的类型.