Я попытался написать короткое приложение на основе диалога Visual Studio C++ MFC и встретить странное поведение, используя ShellExecute()
.Странное поведение в Visual C++ Функция 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() и Notepad начинает нормально.
Когда файл «Config.ini» не существует, код открывает диалоговое окно с только «ОК» и «Отмена».
После нажатия OK диалоговое окно возвращает и запускает ShellExecute(). Блокнот не начинался. Если я прокомментирую строку m_pMainWnd = &dlg;
, то после возвращения диалогового окна с IDOK запустится Блокнот.
Может кто-нибудь объяснить это поведение?
Что такое m_pMainWnd? –
m_pMainWnd - главное окно. Поскольку это приложение диалогового окна, диалоговое окно является основным окном. Эта строка создается мастером MFC. –