我想用CFileDialog打开我的应用程序所在的当前路径,关键代码如下。但是就是不起作用,每次打开时都是前一次打开的文件路径。
奇怪的是,如果我直接把打开路径设置为C盘,CFileDialog就很听话地打开C盘。而我如果是程序动态获取的位置,CFileDialog就是不听使唤。
太奇怪了,谁能解决这个问题,分数全部相送,谢谢各位啦~~~~~~~~~
----------------------------------------------------------------------
CString historyData;
CFileDialog myFileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"txt files (*.txt)|*.txt|All files (*.*)|*.*",NULL);
myFileDialog.m_ofn.lpstrInitialDir = GetExePath();//???为什么不起作用呢?用"C:\\"却起作用
//myFileDialog.m_ofn.lpstrInitialDir = "C:\\";
if(myFileDialog.DoModal()==IDOK)
historyData=myFileDialog.GetPathName();
else
return;
----------------------------------------------------------------------
GetPathName的函数定义如下,我调试过没有问题,用MessageBox把返回值弹出来正好是应用程序所在的目录,如放在C盘的话,返回值是"C:\"//获得当前程序所在的路径
char* CMySnifferDlg::GetExePath()
{
char buff[255];
GetModuleFileName(NULL,buff,254);//程序完整路径加程序名
int len=strlen(buff);
while(len>0 && buff[len-1] !='\\')len--;//去掉程序名,得到路径
buff[len]=0;
char *str=buff;
return str;
}

解决方案 »

  1.   

    局部变量的问题。TCHAR szPath[MAX_PATH] = {0};
    ::GetModuleFileName(hInst, szPath, MAX_PATH);
    ::PathRemoveFileSpec(szPath);
    myFileDialog.m_ofn.lpstrInitialDir = szPath;
      

  2.   

    你太有才了,真的是这样。 CString currentPath;
    currentPath = GetExePath();
    myFileDialog.m_ofn.lpstrInitialDir = currentPath;这样就可以了,但是这是为什么呢?
      

  3.   

    我刚才上面的改法是不对的,程序成功运行估计是侥幸,后来又不行了。请教了高人,改成这样了:
    CString historyData;
    char currentPath[255];
    GetExePath(currentPath);
    CFileDialog myFileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"txt files (*.txt)|*.txt|All files (*.*)|*.*",NULL);
    myFileDialog.m_ofn.lpstrInitialDir = currentPath;
    if(myFileDialog.DoModal()==IDOK)
    historyData=myFileDialog.GetPathName();
    -----------------------------------------------------------------------
    GetExePath函数也改了,如下,用传址的方法:
    //获得当前程序所在的路径
    void CMySnifferDlg::GetExePath(char *currentPath)
    {
    GetModuleFileName(NULL,currentPath,254);//程序完整路径加程序名
    int len=strlen(currentPath);
    while(len>0 && currentPath[len-1] !='\\')len--;//去掉程序名,得到路径
    currentPath[len]=0;
    }
    -----------------------------------------------------------------------
    问题解决,结帖。感谢Mackz(在相互) !
    我给你发消息了,请回复,我对这个问题还是不太明白!