我用VS2008学习vc++中的MFC。照着书上的例子写了个“文件”对话框,在打开的源代码中没有出错,为什么我照着写下后就出错了呢?教材中使用的是VC6.0
代码:
void CFileDlgDlg::OnBnClickedFileOpen()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"All Files(*.TXT)|*.TXT||",AfxGetMainWnd());
CString strPath,strText="";
if(dlg.DoModal() == IDOK)
{
strPath=dlg.GetPathName();
m_OpenPath.SetWindowText(strPath);
CFile file(strPath,CFile::modeRead);
char read[10000];
file.readOnly(read,10000);
for(int i=0;i<file.GetLength();i++)
{
strText += read[i]; }
file.Close();
m_FileText.SetWindowText(strText);
}
}void CFileDlgDlg::OnBnClickedFileSave()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"All Files(*.TXT)|*.TXT||",AfxGetMainWnd());
CString strPath,strText="";
char write[10000];
if(dlg.DoModal() == IDOK)
{
strPath=dlg.GetPathName();
if(strPath.Right(4) != ".TXT")
strPath += ".TXT";
m_SavePath.SetWindowText(strPath);
CFile file(_T(strPath),CFile::modeCreate|CFile::modeWrite);
m_FileText.GetWindowText(strText);
strcpy(write,strText);
file.Write(write,strText.GetLength());
file.Close() }
}这两段代码产生的错误:
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(158) : error C2664: “CFileDialog::CFileDialog(BOOL,LPCTSTR,LPCTSTR,DWORD,LPCTSTR,CWnd *,DWORD,BOOL)”: 不能将参数 5 从“const char [25]”转换为“LPCTSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(159) : error C2440: “初始化”: 无法从“const char [1]”转换为“ATL::CStringT<BaseType,StringTraits>”
1>        with
1>        [
1>            BaseType=wchar_t,
1>            StringTraits=StrTraitMFC_DLL<wchar_t>
1>        ]
1>        class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”
1>        with
1>        [
1>            BaseType=wchar_t,
1>            StringTraits=StrTraitMFC_DLL<wchar_t>
1>        ]
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(163) : error C2065: “m_OpenPath”: 未声明的标识符
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(163) : error C2228: “.SetWindowTextW”的左边必须有类/结构/联合
1>        类型是“'unknown-type'”
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(166) : error C2064: 项不会计算为接受 2 个参数的函数
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(173) : error C2065: “m_FileText”: 未声明的标识符
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(173) : error C2228: “.SetWindowTextW”的左边必须有类/结构/联合
1>        类型是“'unknown-type'”
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(181) : error C2664: “CFileDialog::CFileDialog(BOOL,LPCTSTR,LPCTSTR,DWORD,LPCTSTR,CWnd *,DWORD,BOOL)”: 不能将参数 5 从“const char [25]”转换为“LPCTSTR”
1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(182) : error C2440: “初始化”: 无法从“const char [1]”转换为“ATL::CStringT<BaseType,StringTraits>”
1>        with
1>        [
1>            BaseType=wchar_t,
1>            StringTraits=StrTraitMFC_DLL<wchar_t>
1>        ]
1>        class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”
1>        with
1>        [
1>            BaseType=wchar_t,
1>            StringTraits=StrTraitMFC_DLL<wchar_t>
1>        ]
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2065: “m_SavePath”: 未声明的标识符
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2228: “.SetWindowTextW”的左边必须有类/结构/联合
1>        类型是“'unknown-type'”
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(190) : error C2065: “LstrPath”: 未声明的标识符
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(191) : error C2065: “m_FileText”: 未声明的标识符
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(191) : error C2228: “.GetWindowTextW”的左边必须有类/结构/联合
1>        类型是“'unknown-type'”
1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(192) : error C2664: “strcpy”: 不能将参数 2 从“CString”转换为“const char *”
1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符恳请高手指点

解决方案 »

  1.   

    CString sFilter = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");  //限定文件类型
    CFileDialog Dialog( true, NULL, NULL,
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, (LPCTSTR)sFilter,NULL );//定制打开文件对话框
    if( Dialog.DoModal() == IDOK )  //弹出打开文件对话框
    {
    CString spathName = Dialog.GetPathName(); //路径
    CString m_FileName = Dialog.GetFileName();//文件名
             }
      

  2.   

    VS2008默认使用unicode。你可以选择在VS里面设置,选择菜单Project(工程)->XXX Propertites(工程选项)进入之后,选择第二个:Configuration Propertites->General->Project Defaults->Character Set选择Use Multi-Byte Character Set.这样之后你的代码就可以编译了。或者你也可以改你的代码,需要转换一些变量类型。比如对于CString类型在赋值的时候就应该是这样:CString strPath = _T("");至于其他的你可以google以下。按照错误提示,去google~~
      

  3.   

    果然错误少了好多。
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(163) : error C2065: “m_OpenPath”: 未声明的标识符
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(163) : error C2228: “.SetWindowTextA”的左边必须有类/结构/联合
    1>        类型是“'unknown-type'”
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(166) : error C2064: 项不会计算为接受 2 个参数的函数
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(173) : error C2065: “m_FileText”: 未声明的标识符
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(173) : error C2228: “.SetWindowTextA”的左边必须有类/结构/联合
    1>        类型是“'unknown-type'”
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2065: “m_SavePath”: 未声明的标识符
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2228: “.SetWindowTextA”的左边必须有类/结构/联合
    1>        类型是“'unknown-type'”
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(191) : error C2065: “m_FileText”: 未声明的标识符
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(191) : error C2228: “.GetWindowTextA”的左边必须有类/结构/联合
    1>        类型是“'unknown-type'”只剩之中类型的错误了
      

  4.   

    如果我按照 :
    CString spathName = Dialog.GetPathName(); //路径
    CString m_FileName = Dialog.GetFileName();//文件名这种方法做,以前的问题不显示了,但是会出现新的问题: 
     1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(163) : error C2143: 语法错误 : 缺少“;”(在“.”的前面)
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(173) : error C2143: 语法错误 : 缺少“;”(在“.”的前面)
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2143: 语法错误 : 缺少“;”(在“.”的前面)
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(191) : error C2143: 语法错误 : 缺少“;”(在“.”的前面)恳请高手指点一下
      

  5.   

    你所有的"xxx"字符串
    都写成_T("xxx");
    用_T()、TEXT这个宏
      

  6.   

    改来改去的太麻烦了,你干脆在工程的属性里将字符集由UNICODE改成多字节吧
      

  7.   

    这是编码的改变产生的原因
    VS中默认编码时UNICODE
    而VC6.0默认编码是多字节
    建议使用_T或_TEXT宏进行转换
    在Windows2000及以上操作系统,用Unicode编码效率会高点
    即使用多字节,系统也会转换成UNICODE
      

  8.   

    我设置了的,可是还有  那种   什么什么未声明的错误
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2065: “m_SavePath”: 未声明的标识符
    1>e:\vc\filedlg\filedlg\filedlgdlg.cpp(189) : error C2228: “.SetWindowTextA”的左边必须有类/结构/联合
    1> 类型是“'unknown-type'”
      

  9.   

    这种错误应该看看m_SavePath这个变量到底是什么了?上面的代码中没看到m_SavePath的定义,不好说。
      

  10.   


    类型是unknown-type??神马玩意儿?....这个你懂的吧?