我尝试编写一个简短的基于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后,记事本将会启动。
有人可以解释这种行为吗?
答案 0 :(得分:0)
这似乎只是一个时间问题(如果你设置了m_pMainWnd
更多的清理工作)。如果我在Sleep(300);
之后添加ShellExecute
则可行。您应该记住,ShellExecute
的某些操作可能是异步完成的(例如DDE)。我会考虑在ShellExecuteEx
之前切换到SEE_MASK_NOASYNC
或在终止之前添加Sleep
。
请不要忘记在ShellExecute documentation on MSDN中明确说明初始化COM。