visualc中的奇怪行为&x2B+;ShellExecute()函数 我尝试编写一个简短的VisualStudioC++基于MFC对话框的应用程序,并使用 SeExcel()/遇到一个奇怪的行为。 #包括“stdafx.h” #包括 #包括“Shlwapi.h” #包括“TestShellExecute.h” #包括“TestShellExecuteDlg.h” //CTestShellExecuteApp 开始消息映射(CTestShellExecuteApp,CWinApp) ON_命令(ID_HELP,&CWinApp::OnHelp) 结束消息映射() //唯一的CTestShellExecuteApp对象 CTestShellExecuteApp; //CTestShellExecuteApp初始化 BOOL CTestShellExecuteApp::InitInstance() { CWinApp::InitInstance(); 国际PTR响应; 如果(路径文件存在(文本(“Config.ini”)) nResponse=IDOK; 其他的 { CTestShellExecuteDlg dlg; m_pMainWnd=&dlg; nResponse=dlg.DoModal(); } 如果(nResponse==IDOK) ExecuteApp(); 返回FALSE; } void CTestShellExecuteApp::ExecuteApp(void) { ShellExecute(空,文本(“打开”),文本(“记事本”), 文本(“test.txt”),NULL,SW_SHOWNORMAL); 返回; }

visualc中的奇怪行为&x2B+;ShellExecute()函数 我尝试编写一个简短的VisualStudioC++基于MFC对话框的应用程序,并使用 SeExcel()/遇到一个奇怪的行为。 #包括“stdafx.h” #包括 #包括“Shlwapi.h” #包括“TestShellExecute.h” #包括“TestShellExecuteDlg.h” //CTestShellExecuteApp 开始消息映射(CTestShellExecuteApp,CWinApp) ON_命令(ID_HELP,&CWinApp::OnHelp) 结束消息映射() //唯一的CTestShellExecuteApp对象 CTestShellExecuteApp; //CTestShellExecuteApp初始化 BOOL CTestShellExecuteApp::InitInstance() { CWinApp::InitInstance(); 国际PTR响应; 如果(路径文件存在(文本(“Config.ini”)) nResponse=IDOK; 其他的 { CTestShellExecuteDlg dlg; m_pMainWnd=&dlg; nResponse=dlg.DoModal(); } 如果(nResponse==IDOK) ExecuteApp(); 返回FALSE; } void CTestShellExecuteApp::ExecuteApp(void) { ShellExecute(空,文本(“打开”),文本(“记事本”), 文本(“test.txt”),NULL,SW_SHOWNORMAL); 返回; },mfc,shellexecute,Mfc,Shellexecute,如果文件“Config.ini”存在,代码将直接转到ShellExecute(),记事本将正常启动 当文件“Config.ini”不存在时,代码将打开一个对话框,其中只有OK和Cancel 按“确定”后,对话框返回并运行ShellExecute()。记事本没有启动。如果我注释掉行m_pMainWnd=&dlg,然后在对话框返回IDOK后,记事本将启动 有人能解释一下这种行为吗?这似乎只是一个时间问题(如果您设置了m\u pMainWnd更多的清理工作已经完成)。如果我添加一个睡眠(300)在Sh

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

当文件“Config.ini”不存在时,代码将打开一个对话框,其中只有OK和Cancel

按“确定”后,对话框返回并运行ShellExecute()。记事本没有启动。如果我注释掉行
m_pMainWnd=&dlg,然后在对话框返回IDOK后,记事本将启动


有人能解释一下这种行为吗?

这似乎只是一个时间问题(如果您设置了
m\u pMainWnd
更多的清理工作已经完成)。如果我添加一个
睡眠(300)
ShellExecute
之后执行。您应该记住,
ShellExecute
的某些操作可能是异步完成的(例如DDE)。我会考虑切换到<代码> ShellExecuteEx <代码> >代码> SexMaskSoNoasyNc<代码>,或者在终止之前添加<代码>睡眠< /代码>。< /P>
另外,请不要忘记初始化COM,正如。

中明确指出的那样,这似乎只是一个时间问题(如果您设置了
m\u pMainWnd
则会进行更多清理)。如果我添加一个
睡眠(300)
ShellExecute
之后执行。您应该记住,
ShellExecute
的某些操作可能是异步完成的(例如DDE)。我会考虑切换到<代码> ShellExecuteEx <代码> >代码> SexMaskSoNoasyNc<代码>,或者在终止之前添加<代码>睡眠< /代码>。< /P>
另外,请不要忘记按照中的说明初始化COM。

什么是m_pMainWnd?m_pMainWnd是主窗口。由于这是一个dialogbox应用程序,dialogbox是主窗口。该行由MFC向导生成。什么是m_pMainWnd?m_pMainWnd是主窗口。由于这是一个dialogbox应用程序,dialogbox是主窗口。这一行是由MFC向导生成的。将Sleep(300)放在ShellExecute()之后确实解决了这个问题。我尝试将ShellExecuteEx()与SEE_MASK_NOASYNC一起使用,其行为与ShellExecute()相同。谢谢你的回答。将Sleep(300)放在ShellExecute()之后确实解决了这个问题。我尝试将ShellExecuteEx()与SEE_MASK_NOASYNC一起使用,其行为与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;
}