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)仅在第一次运行或调试时打开,然后第二次及以上,视觉工作室同时消失。
这是同样的问题,但没有给出原因 http://bbs.pediy.com/showthread.php?t=130968
更新 2013-08-27
正如 IInspectable 的建议,它适用于本地资源,但适用于网络资源。
谷歌浏览器是我的默认浏览器,所以我相信其他一些浏览器作为默认浏览器,然后得到以下结果:
(1) 默认浏览器:谷歌浏览器
如果我直接运行我的程序,没关系,它可以工作。网络资源(URL)已打开,程序不会崩溃。
但是,如果我从Visual Studio的“开始调试”按钮调试程序,当事件代码的按钮调用“ShellExcute”时,不仅程序退出,而且Visual Studio也退出。
(2) 默认浏览器:Firfox 或 Internet Explorer
该程序有效,无论何时我直接运行它或从 Visual Studio 调试它,它都不会崩溃或消失。
如上所述,我认为可能是因为程序的 Privilege 不够。所以我相信下面的代码,然后问题就消失了。
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);
}