调用 shellexcute 时程序退出
Posted
技术标签:
【中文标题】调用 shellexcute 时程序退出【英文标题】:program exits when shellexcute was called 【发布时间】:2013-08-28 17:12:54 【问题描述】:win7 操作系统,vs2008。 调用 shellexcute 时我的程序消失了,
这是一个 WTL 项目,代码如下:
*.h
COMMAND_HANDLER(IDC_BTN_LOGIN, BN_CLICKED, DoLogin)
*.cpp
LRESULT XLoginView::DoLogin(WORD, WORD, HWND, BOOL&)
::ShellExecute(NULL, _T("open"), _T("http://mysite.com/login.php"), NULL,NULL, SW_SHOW);
return 0;
点击登录按钮后,我的程序消失了,Visual Studio 也退出了。
连代码都这么简单:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
else
// TODO: code your application's behavior here.
ShellExecute(NULL, L"open", L"http://***.com", NULL, NULL, SW_SHOW);
return nRetCode;
站点(http://***.com)仅在第一次运行或调试时打开,然后第二次及以上,Visual Studio 同时消失。
这里是同样的问题,但没有给出原因 http://bbs.pediy.com/showthread.php?t=130968
2013 年 8 月 27 日更新
根据 IInspectable 的建议,它适用于本地资源,但适用于网络资源。
谷歌浏览器是我的默认浏览器,所以我相信其他一些浏览器作为默认浏览器,然后得到以下结果:
(1) 默认浏览器:谷歌浏览器
如果我直接运行我的程序,没关系,它可以工作。网络资源(URL)已打开,程序不会崩溃。
但是,如果我从 Visual Studio 的“开始调试”按钮调试程序,当事件代码的按钮调用“ShellExcute”时,不仅程序退出,而且 Visual Studio 也会退出。
(2) 默认浏览器:Firfox 或 Internet Explorer
该程序可以正常工作,无论何时我直接运行它或从 Visual Studio 调试它,它都不会崩溃或消失。
如上所述,我想可能是因为程序的权限不够。 所以我相信下面的代码,然后问题就消失了。
void UpPrivilege()
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, L"SeDebugPrivileges", &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
【问题讨论】:
ShellExecute
不会等待启动的进程完成。 See here 使用 ShellExecuteEx
的解决方案。
实际上,Shellexcute 在某个按钮事件中被调用,当按钮被点击时程序消失了,而视觉工作室也消失了。比如问题中的代码也会导致我的电脑出现问题
“一些按钮事件”是什么意思?您的代码中没有任何事件。请准确告诉我们你在做什么,换句话说,当你点击那个按钮时,什么会消失。
-1 您在 cmets 中陈述的内容与问题中陈述的内容相矛盾。你在浪费我们的时间。
我相信使用ShellExecuteEx、Winexec,但仍然出现同样的问题。
【参考方案1】:
2013 年 8 月 27 日更新
根据 IInspectable 的建议,它适用于本地资源,但适用于网络资源。
谷歌浏览器是我的默认浏览器,所以我相信其他一些浏览器作为默认浏览器,然后得到以下结果:
(1) 默认浏览器:谷歌浏览器
如果我直接运行我的程序,没关系,它可以工作。网络资源(URL)已打开,程序不会崩溃。
但是,如果我从 Visual Studio 的“开始调试”按钮调试程序,当事件代码的按钮调用“ShellExcute”时,不仅程序退出,而且 Visual Studio 也会退出。
(2) 默认浏览器:Firfox 或 Internet Explorer
该程序可以正常工作,无论何时我直接运行它或从 Visual Studio 调试它,它都不会崩溃或消失。
如上所述,我想可能是因为程序的权限不够。 所以我相信下面的代码,然后问题就消失了。
void UpPrivilege()
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, L"SeDebugPrivileges", &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
【讨论】:
以上是关于调用 shellexcute 时程序退出的主要内容,如果未能解决你的问题,请参考以下文章