VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 184|回复: 1

[已解决]《C/C++ Windows 程序设计》

[复制链接]
88_avatar_middle
最佳答案
0 
在线会员 发表于 2020-10-11 21:56:06 | 显示全部楼层 |阅读模式
两个执行,第一个打开的路径是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);
}



为什么会有这样的区别
最佳答案
70_avatar_small
2020-10-12 09:37:19
这个是cmd的特性,跟ShellExecuteEx没啥太大关系
cmd 打开之后的路径,是父进程的“当前目录” ,就是父进程GetCurrentDirectory返回的路径

如果你runas 用管理员打开,而父进程没有这个权限,就会通过UAC打开,那就没有父进程了,打开的是cmd默认路径
你可以用管理员启动你编写的程序试试,应该结果就一样了

另外,可以在ShellExecuteEx之前 调用SetCurrentDirectory来改变cmd打开的路径




上一篇:MFC Radio button的选择问题
下一篇:大家好,我有一个关于大数相除的问题
70_avatar_middle
最佳答案
20 
在线会员 发表于 2020-10-12 09:37:19 | 显示全部楼层    本楼为最佳答案   
bestAnswer
这个是cmd的特性,跟ShellExecuteEx没啥太大关系
cmd 打开之后的路径,是父进程的“当前目录” ,就是父进程GetCurrentDirectory返回的路径

如果你runas 用管理员打开,而父进程没有这个权限,就会通过UAC打开,那就没有父进程了,打开的是cmd默认路径
你可以用管理员启动你编写的程序试试,应该结果就一样了

另外,可以在ShellExecuteEx之前 调用SetCurrentDirectory来改变cmd打开的路径
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-21 01:23

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表