当调用shellexecute时程序退出

时间:2013-08-26 08:57:54

标签: winapi visual-c++ windows-7

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);
}

1 个答案:

答案 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);
}