大家只需要随便建一个最简单的MFC,什么都不用干,然后在任何一个地方加入如下代码: CRegKey cregkey;
char filepath[300];
CString childkey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
cregkey.Create(HKEY_LOCAL_MACHINE,childkey);
GetModuleFileName(NULL,filepath,300);
cregkey.SetValue(filepath,"Gu");
cregkey.Close(); CFile x;
char y[5];
if(x.Open("abc.TXT",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)==0){
MessageBox("不能打开");
}
if(x.Read((void*)y,4)==0){
int x=GetLastError();
MessageBox("不能读");
}然后你就会发现,直接双击正常开启,重启后自动开启就会弹出“不能读”,是不是很奇怪,这是世界未解之谜,只需要几行代码!不信你们试试看!!看起来多正常的代码!!就是不行!!快要疯了!!!但是把程序的快捷键放进开始菜单的启动里然后开机重启却是正常的!!神啊!我已经发了3个贴了都没人能真正解决这几行代码的问题吗!!!!!

解决方案 »

  1.   

    用绝对路径试试看 
    x.Open("c:\\abc.TXT",估计是当前路径的问题GetCurrentDirectory看看当前路径是什么
      

  2.   

    妈呀,这MFC这么难啊.我学c++才半年呢,范磊老师的还没看完啊
      

  3.   

    if(x.Open("abc.TXT",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)==0){// 这句不显示,表示文件在什么地方重新产生了(modeCreate的原因),
            MessageBox("不能打开");
    }
    if(x.Read((void*)y,4)==0)
    {//这个新产生的文件长度为0,读什么都错的。
            int x=GetLastError();
            MessageBox("不能读");
    }
    //所以:
    1.去:CFile::modeCreate
    2.设置当前路径到有问题的目录。
    SetCurrentDirectory()
      

  4.   


    为什么!!为什么!!!为什么GetCurrentDirectory后路径居然变成C:\Documents and Settings\Administrator
    我看过在注册表的地址明明是E:\软件\baby\Debug\baby.exe的!!怎么变成这样了!!!我不想用绝对路径啊!我这个软件是要放其他电脑上的!难道相对路径不可以吗!
      

  5.   

    为什么!!为什么!!!为什么GetCurrentDirectory后路径居然变成C:\Documents and Settings\Administrator
    我看过在注册表的地址明明是E:\软件\baby\Debug\baby.exe的!!怎么变成这样了!!!我不想用绝对路径啊!我这个软件是要放其他电脑上的!难道相对路径不可以吗!
      

  6.   

    为什么!!为什么!!!为什么GetCurrentDirectory后路径居然变成C:\Documents and Settings\Administrator
    我看过在注册表的地址明明是E:\软件\baby\Debug\baby.exe的!!怎么变成这样了!!!我不想用绝对路径啊!我这个软件是要放其他电脑上的!难道相对路径不可以吗!还有,那个abc.txt文件我事先放有东西进去的!
      

  7.   

    当前的路径不代表你的可执行程序的当前路径,因此你想用相对路径读文件,这么做:
    CString str;
    str=theApp.m_ExePath+"\\c.txt";
    if(x.Open(str,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)==0){
            MessageBox("不能打开");
    }
    在软件初始化函数里:
    WCHAR Buff[MAX_PATH];//如果是多字节,就char Buff[MAX_PATH];
    CString str;
    str="取路径错误";
    if(GetModuleFileName( NULL,Buff,256 )==0)
    {
    AfxMessageBox(str);
    }
    else
    {
    theApp.m_ExePath=Buff;
    theApp.m_ExePath=theApp.m_ExePath.Left(theApp.m_ExePath.Find("abc.exe"));
    }
      

  8.   

    获得当前路径,可以使用
    GetModuleFileName
      

  9.   

    改变的是
    BOOL CreateProcess(
      LPCTSTR lpApplicationName,                 // name of executable module
      LPTSTR lpCommandLine,                      // command line string
      LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
      LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
      BOOL bInheritHandles,                      // handle inheritance option
      DWORD dwCreationFlags,                     // creation flags
      LPVOID lpEnvironment,                      // new environment block
      LPCTSTR lpCurrentDirectory,                // current directory name
      LPSTARTUPINFO lpStartupInfo,               // startup information
      LPPROCESS_INFORMATION lpProcessInformation // process information
    );
    中的LPCTSTR lpCurrentDirectory,即程序的启动目录。
      

  10.   

    这个函数是系统运行的吗!但是我在C:\Documents and Settings\Administrator里面并没有我的软件啊 它怎么就会改成这里运行!
      

  11.   

    双击可以 是因为资源管理器 在每打开一级目录的时候更换了当前路径应用程序却不见得非得从当前路径启动如命令行模式下启动 D:\XX\yy\zz.exe 当前路径却可以是在任意地方,而且会变所以不要相信当前路径, 使用程序路径构造出绝对路径,那才是可靠的
    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")TCHAR szAppPath[MAX_PATH+1] = {0};
    GetModuleFileName(NULL, szAppPath, MAX_PATH);
    PathRemoveFileSpec(szAppPath);
    _tcscat_s(szAppPath, _T("\\abc.TXT"));