-4

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

1 回答 1

0

更新 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);
}
于 2013-08-27T03:59:08.400 回答