获取WinExec()中的路径有关问题
获取WinExec()中的路径问题
我写了个基于对话框的小程序,想实现的功能是通过本程序打开其他程序.
首先按“浏览”选择一个程序,然后获得程序路径,代码如下:
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]必须是个左值。
现在自己已经没头绪了,不知道该如何实现这个小程序的功能了。
请大家给想想办法,解决我的思路下遇到的困难,或者给出新的思路都行。
------解决方案--------------------
我已经在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);
}
------解决方案--------------------
LZ好像一直在困惑要不要把 "\ "换成 "\\ ",实际上是没必要的,你能在浏览对话框看到诸如 "x:\xxx "的形式,你用一个变量去取的话,这个变量实际上就已经等于你自己去定义 "x:\\xxx "这样一个字符串.
不信的话你可以把这个变量用控制台输出一下
另外你说的 "因为VC6的默认编码是ASCⅡ,而VS2005的默认编码是UNICODE. " 你可以把2005的编码改成多字节的,否则调用的函数实际上都是W的版本
我写了个基于对话框的小程序,想实现的功能是通过本程序打开其他程序.
首先按“浏览”选择一个程序,然后获得程序路径,代码如下:
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]必须是个左值。
现在自己已经没头绪了,不知道该如何实现这个小程序的功能了。
请大家给想想办法,解决我的思路下遇到的困难,或者给出新的思路都行。
------解决方案--------------------
我已经在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);
}
------解决方案--------------------
LZ好像一直在困惑要不要把 "\ "换成 "\\ ",实际上是没必要的,你能在浏览对话框看到诸如 "x:\xxx "的形式,你用一个变量去取的话,这个变量实际上就已经等于你自己去定义 "x:\\xxx "这样一个字符串.
不信的话你可以把这个变量用控制台输出一下
另外你说的 "因为VC6的默认编码是ASCⅡ,而VS2005的默认编码是UNICODE. " 你可以把2005的编码改成多字节的,否则调用的函数实际上都是W的版本