【发布时间】: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://stackoverflow.com", NULL, NULL, SW_SHOW);
}
return nRetCode;
}
站点(http://stackoverflow.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,但仍然出现同样的问题。
标签: winapi visual-c++ windows-7