win7 OS,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;
}
点击登录按钮后,我的程序就消失了,视觉工作室也退出了。
即使代码也很简单:
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)默认浏览器:Google Chrome
如果我直接运行我的程序,没关系,它可以工作。 Web资源(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);
}
答案 0 :(得分:0)
更新2013-08-27
作为IInspectable的建议,它适用于本地资源,但适用于网络资源。
谷歌浏览器是我的默认浏览器,所以我相信其他浏览器是默认浏览器,然后在下面得到以下结果:
(1)默认浏览器:Google Chrome
如果我直接运行我的程序,没关系,它可以工作。 Web资源(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);
}