Visual C ++ ShellExecute()函数中的奇怪行为

时间:2017-02-02 05:46:34

标签: mfc shellexecute

我尝试编写一个简短的基于Visual Studio C ++ MFC对话框的应用程序,并使用ShellExecute()遇到一个奇怪的行为。

#include "stdafx.h"
#include <iphlpapi.h>
#include "Shlwapi.h"
#include "TestShellExecute.h"
#include "TestShellExecuteDlg.h"

// CTestShellExecuteApp
BEGIN_MESSAGE_MAP(CTestShellExecuteApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

// The one and only CTestShellExecuteApp object
CTestShellExecuteApp theApp;

// CTestShellExecuteApp initialization
BOOL CTestShellExecuteApp::InitInstance()
{
    CWinApp::InitInstance();

    INT_PTR nResponse;
    if (PathFileExists(TEXT("Config.ini")))
        nResponse = IDOK;
    else
    {
        CTestShellExecuteDlg dlg;
        m_pMainWnd = &dlg;
        nResponse = dlg.DoModal();
    }
    if (nResponse == IDOK)
        ExecuteApp();
    return FALSE;
}

void CTestShellExecuteApp::ExecuteApp(void)
{
    ShellExecute(NULL, TEXT("open"), TEXT("notepad"), 
        TEXT("test.txt"), NULL, SW_SHOWNORMAL);
    return;
}

如果文件“Config.ini”存在,代码将直接转到ShellExecute()并且记事本启动正常。

当文件“Config.ini”不存在时,代码会打开一个只有“确定”和“取消”的对话框。

按下OK后,对话框将返回并运行ShellExecute()。记事本没有启动。如果我注释掉行m_pMainWnd = &dlg;,那么在对话框返回IDOK后,记事本将会启动。

有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:0)

这似乎只是一个时间问题(如果你设置了m_pMainWnd更多的清理工作)。如果我在Sleep(300);之后添加ShellExecute则可行。您应该记住,ShellExecute的某些操作可能是异步完成的(例如DDE)。我会考虑在ShellExecuteEx之前切换到SEE_MASK_NOASYNC或在终止之前添加Sleep

请不要忘记在ShellExecute documentation on MSDN中明确说明初始化COM。