|
两个执行,第一个打开的路径是system下,而第二个是在当前exe文件下的
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空
sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似
sei.lpFile = _T("cmd.exe");
sei.nShow = SW_SHOW;
sei.lpVerb = _T("runas");
ShellExecuteEx(&sei);
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = _T("cmd.exe");
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;//使用 SEE_MASK_NOCLOSEPROCESS 参数
sei.lpVerb = _T("open");
if (ShellExecuteEx(&sei))//执行成功
{
if (sei.hProcess)//指定 SEE_MASK_NOCLOSEPROCESS 并其成功执行,则 hProcess 将会返回执行成功的进程句柄
WaitForSingleObject(sei.hProcess, INFINITE);//等待执行完毕
}
else
{
CString s;
s.Format(_T("ShellExecuteEx error,error code:%d"), GetLastError());
MessageBox(s);
}
为什么会有这样的区别
这个是cmd的特性,跟ShellExecuteEx没啥太大关系
cmd 打开之后的路径,是父进程的“当前目录” ,就是父进程GetCurrentDirectory返回的路径
如果你runas 用管理员打开,而父进程没有这个权限,就会通过UAC打开,那就没有父进程了,打开的是cmd默认路径
你可以用管理员启动你编写的程序试试,应该结果就一样了
另外,可以在ShellExecuteEx之前 调用SetCurrentDirectory来改变cmd打开的路径
|
上一篇: MFC Radio button的选择问题下一篇: 大家好,我有一个关于大数相除的问题
|