我的系统:Windows 2000 + SP4、VC6 + SP6、Microsoft Platform SDK February 2003
然后在StdAfx.h里开头处打如下
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#ifdef WINVER
#undef WINVER
#endif
#define _WIN32_WINNT 0x0500 
#define WINVER 0x0500
定义使用windows2000的操作系统,从而可以应用一些新的SDK
然后在OnNewDocument的时候执行如下代码
BOOL CSongManageDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
CString strPathName;
CString strFileName;
CFileDialog dlg(TRUE , "dbf" , NULL , OFN_FILEMUSTEXIST
, "DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*|" , NULL);
if(dlg.DoModal() != IDOK)
{
m_iOpen = 0;
return FALSE;
} strPathName = dlg.GetPathName();
strFileName = dlg.GetFileName();
return TRUE;
}编译通过后,执行新建文档操作,如常打开一个“打开文件对话框”,打开任意一个文件,即报错!
Unhandled exception in File Splitter.exe (KERNEL32.DLL): 0xC0000005: Access Violation搜索了一个Google,发现有个外国人也发现了这个问题,但是不了了之。。请看如下外国链接(速度比较慢):
http://tek-tips.com/viewthread.cfm?qid=815048
http://forums.devarticles.com/t7641/s.html?highlight=display+text+file+list+in+cfloop+containing+blank+spaces如果把stdafx.h里的定义_WIN32_WINNT 和 WINVER 取消,那么就十分正常,但是只要加上去,即报错!
谁能解决此问题,100分相送!!

解决方案 »

  1.   

    把 _WIN32_WINNT 和 WINVER 取消
      

  2.   

    晕死这个我也知道。。但是我里面有用一些win2000才有的api,所以必须加上去。要不然不能通过编译。新的SDK很多API都是#if (_WIN32_WINNT >= 0x0500)的
      

  3.   

    不定义_WIN32_WINNT 和 WINVER 为0x0500也没有关系,一样可以调用win2000的函数HINSTANCE hInst = LoadLibrary("User32.DLL");//具体那个dll最好查MSDN
    if(hInst)
    {
     typedef BOOL (WINAPI *MYFUNC)(...); // 函数指针定义
     MYFUNC fun = NULL;
     fun=(MYFUNC)GetProcAddress(hInst, "...");  // 取得指针
     if(fun)
          fun(...);
     FreeLibrary(hInst);
    }
      

  4.   

    我的
    Windows 2000 S+ SP3、VC6 、Microsoft Platform SDK February 2003复制你的代码运行都好像没什么问题
      

  5.   

    我的是VC.net 2003,不出错误。
      

  6.   

    但是OPENFILENAME在不同的WINVER下定义不一样,你看看源码。
      

  7.   

    赞成楼上的观点,应该是预编译宏当面的问题,xuexi!
      

  8.   

    to  pomelowu:
    谢谢你的提议。。但这毕竟不是治本之法。
    to DeadWolf:
    可能你没有庄vc6sp6
    to  Mackz:
    我都看过了。。多了三个参数,那应该怎样?
      

  9.   

    像这样,判断系统版本,条件编译的函数太多了啊。有个搞动画窗口的,只能在5.0以上才可以编译通过。改改就是啦。新版msdn都会说出支持那个版本的
      

  10.   

    错误原因就是:多出的三个参数,没有正确编译,因此出现了指针错误。没有办法,也许改一下源码,重新编译一下MFC库能够解决问题。
      

  11.   

    对呀,你的过滤字符串结尾为什么只有一个"|"?我以前也犯过这样的错误的!
    CString sFilter="jpeg文件(*.jpg)|*.jpg|bmp文件(*.bmp)|*.bmp|GIF文件(*.gif)|*.gif||";
      

  12.   

    我在stdafx.h文件中加上了那些宏定义也没有问题呀(Windows Server 2003,VC 6.0 + SP5, Microsoft Platform SDK February 2003),我把程序拿到Windows 2000上测试(SP4, VC)也没有问题的。条件就是我的打开对话框的过滤字符串结尾使用的是"||"。
      

  13.   

    原来是放了两个"||"的,后来改了一下,我也试过改回去,但是错误都是一样的!错误是发生在~CFileDialog中,即析构函数中!
      

  14.   

    #ifdef _WIN32_WINNT
    #undef _WIN32_WINNT
    #endif
    #ifdef WINVER
    #undef WINVER
    #endif
    #define _WIN32_WINNT 0x0500 
    #define WINVER 0x0500
    我以前也碰到过和你一样的问题。
    我解决的方法是直接用api解决的,不用CFileDialog
      

  15.   

    那就是说如果要0x500就不可以用CFileDialog了?
      

  16.   

    还是能用的,我把代码改成下面的样子就好了。但为什么没搞清楚,还请大侠指点。
    CFileDialog *dlg = new CFileDialog(TRUE , "dbf" , NULL , OFN_FILEMUSTEXIST,
    "DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*|" ,this);
    dlg->m_ofn.lStructSize = sizeof(OPENFILENAME);
    if(dlg->DoModal() != IDOK)
    {
    return;
    }

    strPathName = dlg->GetPathName();
    strFileName = dlg->GetFileName();
    delete dlg;
      

  17.   

    dlg->m_ofn.lStructSize = sizeof(OPENFILENAME);
    这句没必要,是设定2000风格的。
      

  18.   

    试过这样改了。但是还是不行。。而且你那段代码有内存泄漏。应该改成
    CFileDialog *dlg = new CFileDialog(TRUE , "dbf" , NULL , OFN_FILEMUSTEXIST,
    "DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*|" ,this);
    dlg->m_ofn.lStructSize = sizeof(OPENFILENAME);
    if(dlg->DoModal() != IDOK)
    {
    delete dlg;
    return;
    }strPathName = dlg->GetPathName();
    strFileName = dlg->GetFileName();
    delete dlg;
      

  19.   

    还不行?我这里是直接声明不行,new了就没问题。
    我的系统配置和你的一样。呵呵。
      

  20.   


    CFileDialog dlg(TRUE , "dbf" , NULL , OFN_FILEMUSTEXIST
    , "DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*|" , NULL);
    改为:
    CFileDialog dlg(TRUE , "dbf" , NULL , OFN_FILEMUSTEXIST
    , "DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*|" , NULL, sizeof (OPENFILENAME) );
    试试
      

  21.   

    MSDN:
    dwSize
    The size of the OPENFILENAME structure. This value is dependent on the operating system version, so MFC can determine the appropriate kind of dialog to create (for example, new Windows 2000 dialogs as opposed to NT4 dialogs).
      

  22.   

    在#include <afxwin.h>之后添加:
    #if _WIN32_WINNT >= 0x0500
    #undef _WIN32_WINNT
    #endif
      

  23.   

    并非什么 BUG
    这样做"DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*|" 
    改成
    "DBF数据库文件(*.dbf)|*.dbf|所有文件(*.*)|*.*||" 
    -----------------------------------------------------------
    结束时是两个||,而不是一个|