C++ CFileDialog实例化的问题

C++ CFileDialog实例化的问题,c++,mfc,cfiledialog,C++,Mfc,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
的定义,但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\visualstudio 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);

有什么问题吗?

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

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

在Visual Studio中创建项目时,使用的默认字符集类型是Unicode,而不是MBCS,也不是“not set”。这意味着采用字符数组和指针的Windows API和MFC函数将使用宽字符。因此,在需要宽字符串的Windows API函数上使用
char
char*
const char*
,将无法编译

即使您对Unicode或MBCS一无所知,也表明您的代码是错误的,即您调用的函数采用了
LPCTSTR
的类型——这不是
const char*
,而是它本身,即指向
TCHAR
的常量指针。如果您坚持知道使用指定的类型,那么您就可以开始了


因此,教训是,如果函数需要类型,请提供该类型的变量或表达式,而不是您认为该类型等效的变量或表达式

好的。因此,我将代码更改为:

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

而且,现在没有问题了。谢谢你的回复

这是UNICODE版本还是MBCS?@PaulMcKenzie我不知道如何回答这个问题。这是一个空白的MFC程序,这是我在文件->打开事件中输入的第一段代码handler@user134788请在字符串文字前面加上
L
,然后重试。您必须将
strFilter
的类型更改为
WCHAR
。如果你已经接受了使用T宏的想法,用
\u T()
包围你的文本,并对
strFilter[]
类型使用
TCHAR
,TCHAR的另一件事是,你不应该对字符串使用
L“…”
,甚至
你应该使用
\u T(“…”
)。这是因为TCHAR可以是
char
WCHAR