我写了个基于对话框的小程序,想实现的功能是通过本程序打开其他程序.
首先按“浏览”选择一个程序,然后获得程序路径,代码如下:
void CEasyUDlg::OnBnClickedOpen()
{
CFileDialog ldFile(TRUE); if(ldFile.DoModal() == IDOK) m_strPROPATH = ldFile.GetPathName();                  UpdateData(FALSE);}//程序路径在一个编辑框中显示然后要实现的是,按下“运行”即能够打开相应程序,在这里就出了问题:WinExec(LPCSTR value, SW_SHOW)中,第一个参数必须是LPCSTR类型,而m_strPROPATH是CString类型。在网上搜了,得知可以用以下方法将CString转化为LPCSTR,代码如下:int length = m_strPROPATH.GetLength();   LPCSTR lpstrPROPATH = (LPCSTR)m_strPROPATH.GetBuffer(length);
  
   size_t aLen = length + 1;   WinExec(lpstrPROPATH, SW_SHOW);请问对不对?总之我这样转化了之后,能编译通过,但选定欲运行程序后,点了“运行”却没反应。又想起获得的程序路径中层次符是用'\'表示的,而VC和VS环境表示层次符的应该是'/',于是又写了如下转化代码:int length = m_strPROPATH.GetLength(); int i = 0; while(i < length) {

if ( m_strPROPATH[i]=='\\')
m_strPROPATH[i] = '/'; i++; } 如此改动后,有错了,提示m_strPROPATH[i]必须是个左值。现在自己已经没头绪了,不知道该如何实现这个小程序的功能了。请大家给想想办法,解决我的思路下遇到的困难,或者给出新的思路都行。

解决方案 »

  1.   

    有...有这么复杂吗?你直接用CString类型作参数好了,强制转化一下类型就可以了,CString重载了LPCTSTR,因此(LPCSTR)(LPCTSTR)str这样就行了。
      

  2.   

    CString strPath;
    strPath = "f:\\文件名.exe"    //自己可以该路径
    WinExec(strPath , SW_SHOW);直接用。
      

  3.   

    好像不行呢,我刚测试了,
    令:m_strPROPATH = "G:/qq/QQ.exe";    LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;//按你们说的    WinExec(lpstrPROPATH, SW_SHOW);    调试的时候按运行还是没反应,而如果直接写WinExec("G:/qq/QQ.exe", SW_SHOW);就OK。说明还是类型转化的时候有问题。     再者,上边的"G:/qq/QQ.exe";是我自己写的,若是程序自动获得的路径,那么会是"G:\qq\QQ.exe";,还得想办法把'\'换成'/'。这又是一个麻烦的地方……
      

  4.   

    CString strPath;
    strPath = "f:\\文件名.exe"    //自己可以该路径
    WinExec(strPath , SW_SHOW);直接用。而且这是不可以直接用的,WinExec(LPCSTR value, SW_SHOW)中,第一个参数必须是LPCSTR类型
      

  5.   

    首先我想说一下,在VC和VS里文件名是可以用“X:\\file.exc”这样的字符串表示的,在得到文件全名字符串之后不用把“\”改成“/”;其次CString可以直接作为LPCSTR类型的参数传递的。以上至少可以在VC++6.0上通过。
      

  6.   

    可以直接查看CString的源代码,它有重载LPCTSTR 的操作符的.
    你可以这样转换 (LPCTSTR)str,也可以直接用GetBuffer(..),使用完毕以后记得释放ReleaseBuffer
      

  7.   

    我已经在VC++6.0上编译通过。关键代码如下:
    void CMyDlg::OnBrowse() 
    {
    // TODO: Add your control notification handler code here
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"*.exe(程序文件)|*.exe||");
    if(dlg.DoModal()==IDOK)
    {
    m_strShow=dlg.GetPathName();
    UpdateData(FALSE);
    }
    }void CMyDlg::OnRun() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE);
    WinExec(m_strShow,SW_SHOW);
    }
      

  8.   

    谢谢SmallGreenGrass,但是请问
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"*.exe(程序文件)|*.exe||");
    这样写起什么作用?我自己只写了CFileDialog ldFile(TRUE);,后面那些参数是起什么作用的呢?
    而且你的代码里似乎没体现把获得的路径中的‘\’改成‘\\’。最后,我的IDE是VS2005,写成你的CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"*.exe(程序文件)|*.exe||");
    还会报错,cannot convert parameter 5 from 'const char [24]' to 'LPCTSTR'因为VC6的默认编码是ASCⅡ,而VS2005的默认编码是UNICODE.我自己写的:
    void CEasyUDlg::OnBnClickedOpen()
    {
    CFileDialog ldFile(TRUE); if(ldFile.DoModal() == IDOK) m_strPROPATH = ldFile.GetPathName();                           UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
    }void CEasyUDlg::OnBnClickedProtorun()
    {
        UpdateData(TRUE);
        
        LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;
        
        WinExec(lpstrPROPATH, SW_SHOW);// TODO: 在此添加控件通知处理程序代码}
    编译没问题,可是运行后点了运行程序,却没反应。为什么呀?
      

  9.   

    _T("*.exe(程序文件)|*.exe||")
    没有这样的话,路径名是不会有后缀的~~也就是为什么你打不开的原因
      

  10.   

    to livedeal(怀念) 
    还是不行呢,个人感觉问题出在WinExec不认转化过来的LPCSTR lpstrPROPATH
    没有把‘\’改成‘\\’,对么?
      

  11.   

    m_strPROPATH    你看看是这里值是什么~???你不是有个控件来显示的吗~??看的到"\"就行了,我们写入去的时候要用"\\"输入,显示还是只有"\"的,这个好像是很基础的吧!!!
      

  12.   

    对啊,可是我这么写
    void CEasyUDlg::OnBnClickedProtorun()
    {
        UpdateData(TRUE);
        
        LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;
        
        WinExec(lpstrPROPATH, SW_SHOW);// TODO: 在此添加控件通知处理程序代码}就是不行呀,那你觉得是什么问题呢?
      

  13.   

    yihan7h(奕寒),代码“LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;”应该为“LPCSTR lpstrPROPATH = (LPCTSTR)m_strPROPATH;”,只需要强制转化一次就行。
    另外我不知道VC2005和VC6.0之间究竟有多大差别。你可以直接用我的代码试一下,包括把编码也改为ASCII。另外为什么CString类可以直接做为LPCSTR类型的参数你可以看看MSDN。
      

  14.   

    to SmallGreenGrass():vs2005中只能写为“LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;”,写“LPCSTR lpstrPROPATH = (LPCTSTR)m_strPROPATH;”将报错,不能从CString转化为LPCSTR。被这个问题搞的无奈了都……简明点说吧:
    WinExec("F:/Tools/Web迅雷/WebThunder.exe", SW_SHOW);WinExec("F:\\Tools\\Web迅雷\\WebThunder.exe", SW_SHOW);直接填路径有如上两种方法都可以成功运行。但显然,程序初衷不是这样……而填变量,注意,在VS2005中WinExec函数第一个参数只能是LPCSTR类型1:m_strPROPATH =ldFile.GetPathName();//控件中显示的是F:\Tools\Web迅\WebThunder.exe   LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;//类型转化   WinExec(lpstrPROPATH,SW_SHOW);
    编译无错,无警告,实际点运行程序后没反应……2:m_strPROPATH =ldFile.GetPathName();//控件中显示的是F:\Tools\Web迅\WebThunder.exe   自己写一个函数,将获得路径中的'\'转化为'/',即把m_strPROPATH的值改为F:/Tools/Web   迅/WebThunder.exe   
       LPCSTR lpstrPROPATH = (LPCSTR)(LPCTSTR)m_strPROPATH;/*此时的m_strPROPATH已经为                                                     F:/Tools/Web迅/WebThunder.exe*/   WinExec(lpstrPROPATH,SW_SHOW);编译无错,无警告,实际点运行程序后仍无反应……好无奈哎~~~~~
      

  15.   

    你用浏览对话框得到的路径变量就是"x:\xxx"格式的,不用再去变成"x:\\xxx"或"x:/xxx"
    直接这样看看:
             char path[100];
    sprintf(path,m_strPROPATH );
    int result=WinExec(path,1);
      

  16.   

    LZ好像一直在困惑要不要把"\"换成"\\",实际上是没必要的,你能在浏览对话框看到诸如"x:\xxx"的形式,你用一个变量去取的话,这个变量实际上就已经等于你自己去定义"x:\\xxx"这样一个字符串. 
    不信的话你可以把这个变量用控制台输出一下另外你说的"因为VC6的默认编码是ASCⅡ,而VS2005的默认编码是UNICODE." 你可以把2005的编码改成多字节的,否则调用的函数实际上都是W的版本
      

  17.   

    简明点说吧:
    .......1:m_strPROPATH =ldFile.GetPathName();//控件中显示的是F:\Tools\Web迅\WebThunder.exe
    =================================================
    你不觉得少了一个"雷"字吗?
      

  18.   

    to newerC() :
    你可以把2005的编码改成多字节的,否则调用的函数实际上都是W的版本恕我无知,刚入门,改成多字节的?在我理解来看,UNICODE不就是多字节么,用两个字节来存放一个字符呀,难道ASCⅡ就是你说的多字节?
    看来把"\"转化为"/"是不必要的了,可是无论我转化还是不转化,最终都不行……
    实在解决不了,我打算在VC6里面写一个DLL,然后在VS里调用……
    但是感觉太小题大作了……自己汗一个
      

  19.   

    我也运到这样的问题,试了一天一夜没办法,只能用英文路径
    ==============
    楼主的意思是WinExec只能执行lpcstr,在vc6里面lpcstr与lpctstr是不分的,所以 能 执行中英文路径。
    但在2005中就是不行,建议楼主采用英文路径,msdn说了也可以用CreateProcess来运行另一个程序,由于我对这个函数不是很熟悉,所以没怎么尝试!!用英文路径就可以了
    TCHAT szPath[MAX_PATH];
    GetCurrentDir(szPath,...);//函数名不一定正确,请注意这个当前程序路径要用英文的
    char szExe[MAX_PATH];
    spintf_s(szExe, "%S\\qq.exe", szPath);
    WinExec(szExe, SW_SHOWNORMAL);