我在单文档程序APP类中创建CFILEDIALOG类后,可以显示文件列表了,但是我不能在CFILEDIALOG窗口中打开文件,
下面是部分代码
void CDataDisplayApp::OnFileOpen() 
{
CFileDialog fileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
              "工作表(*.xls)|*.xls|文本文件(*.txt)|*.txt||",NULL);
fileDlg.m_ofn.lpstrInitialDir = "..\\hisdata";
fileDlg.DoModal();
}
我想打.txt .xls文件,但是怎么调用excel和notepad呢

解决方案 »

  1.   

         使用CreateProcess函数,看看msdn这个函数的用法。
      

  2.   

    这个只是给了你一个选择文件名的机会,并不给你打开文件,还需要你自己打开。fileDlg.DoModal()以后,你选择了一个文件名,然后点击打开,就从对话框出来了。这时你要:
    CString name=fileDlg.GetPathName();来获取文件名字,然后CFile f;
    f.Open(name,CFile::modeRead);
    ....打开文件和显示文件。
      

  3.   

    ::ShellExecute(NULL, "open", fileDlg.GetPathName(), "", "", SW_SHOW);
    LZ试试看这个
      

  4.   

    哦? 是调用调用excel和notepad这个?用一楼的说的函数创建进程。
      

  5.   

    在fileDlg.DoModal(); 后面加ShellExecute(m_hWnd,"open",
    fileDlg.GetFileName(),
    "","",1);要保证fileDlg.GetFileName()得到的文件路径和文件名都是争取用的如:"C:\Windows\1.txt"
      

  6.   

    我用createprocess也就是下面的代码
    CreateProcess(NULL,"D:\\office 2003\\OFFICE11\\EXCEL.EXE H:\\hisdata\\xls\\2009-8-24.xls",   NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
    可以打开excel文件,但是是用的绝对路径,请问如何用相对路径呢
      

  7.   


       参考我的文章: ::GetModuleFileName函数的一个妙用 
      

  8.   

    fileDlg.DoModal()以后,你选择了一个文件名,然后点击打开,就从对话框出来了。这时你要: 
    CString name=fileDlg.GetPathName();来获取文件名字,然后 CFile f; 
    f.Open(name,CFile::modeRead); 
    .... 
    CreateProcess(NULL,"D:\\office 2003\\OFFICE11\\EXCEL.EXE H:\\hisdata\\xls\\2009-8-24.xls",  NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); 两种方式应该都可以吧
      

  9.   

    按照给位高人的指教我解决了问题,下面是解决方法:
    void CDataDisplayApp::OnFileOpen() 
    {
    DWORD fileTypeIndex;
    CString fileName;
    HKEY hKey;
    if( RegOpenKeyEx(HKEY_LOCAL_MACHINE,  // 要打开的根键 
    "SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\APP PATHS\\EXCEL.EXE", // 要打开的子子键 
    0,        // 这个一定要为0 
    KEY_QUERY_VALUE,  //  指定打开方式,此为读 
    &hKey) !=ERROR_SUCCESS )
    AfxMessageBox("查找可执行程序路径失败");
    DWORD valueLen = MAX_PATH;
    char value[MAX_PATH];
    if( RegQueryValueEx(hKey,  // 打开注册表时返回的句柄 
    "Path",  //要查询的名称,qq安装目录记录在这个保存
    NULL,   // 一定为NULL或者0 
    NULL,  
    (LPBYTE)value, // 返回path的键值,也就是应用程序路径 
    &valueLen) )
    AfxMessageBox("得到可执行程序路径失败");

    STARTUPINFO si;
    memset(&si, 0, sizeof(STARTUPINFO)); 
    si.cb = sizeof(STARTUPINFO); 
    si.dwFlags = STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_SHOW; 
    PROCESS_INFORMATION pi;
    CFileDialog fileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"工作表(*.xls)|*.xls|文本文件(*.txt)|*.txt||",NULL);
    fileDlg.m_ofn.lpstrInitialDir = "..\\hisdata";
    if( fileDlg.DoModal() == IDOK )
    {
    fileTypeIndex = fileDlg.m_ofn.nFilterIndex;
    fileName = fileDlg.GetPathName();
    switch(fileTypeIndex)
    {
    case 1:
    {
    strcat(value,"\excel.exe  ");
    strcat(value,fileName.GetBuffer(0));
    CreateProcess(NULL,value,
    NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
    break;
    }
    case 2:
    {
    char string[80];
                    strcpy( string, "notepad " );
                    strcat(string,fileName.GetBuffer(0));
    CreateProcess(NULL,string,
    NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
    break;
    }
    }

    }
    }