调用 shellexcute 时程序退出

Posted

技术标签:

【中文标题】调用 shellexcute 时程序退出【英文标题】:program exits when shellexcute was called 【发布时间】: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://***.com", NULL, NULL, SW_SHOW);
    

    return nRetCode;

站点(http://***.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,但仍然出现同样的问题。 【参考方案1】:

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

【讨论】:

以上是关于调用 shellexcute 时程序退出的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本或C程序返回值为什么不能大于255

Shell 脚本在失败时未记录 Java 退出状态

Shell命令的退出状态及错误检查

源 shell 脚本的退出代码

shell进交互式不退出

往shell脚本中传入参数