我遵循CFileDialog
的定义,但VS2013仍然告诉我,我传递的参数没有可用的构造函数。
我的代码:
CFile theFile;
char strFilter[] = { "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" };
CFileDialog fDlg = CFileDialog(TRUE, ".txt", NULL, 0, strFilter);
结果错误:
1智能感知:没有构造函数的实例" 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);
问题是什么?
答案 0 :(得分:5)
问题似乎是您使用了错误的字符串类型。
快速解决方案是使用TCHAR
而非char
。更好的解决方案是只使用宽字符串并确保构建是Unicode。
在Visual Studio中创建项目时,使用的默认字符集类型是Unicode,而不是MBCS,而不是"未设置"。这意味着采用字符数组和指针的Windows API和MFC函数将使用宽字符。因此,在期望使用宽字符串的Windows API函数上使用char
,char *
,const char*
将无法编译。
即使您对Unicode或MBCS一无所知,您的代码错误的指示是您正在调用的函数采用LPCTSTR
类型 - 即不 a const char *
,就是它,即指向TCHAR
的常量指针。如果您不知道如何使用指定的类型,那么您将会很高兴。
因此,经验教训是,如果函数需要一个类型,请提供该类型的变量或表达式,而不是您认为该类型等效的类型。
答案 1 :(得分:2)
确定。所以我已将代码更改为以下内容:
CFile theFile;
TCHAR strFilter[] = { _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||") };
CFileDialog fDlg = CFileDialog(TRUE, _T(".txt"), NULL, 0, strFilter);
而且,现在没有问题。感谢您的回复!