2017-02-02 10 views
1

Я попытался написать короткое приложение на основе диалога 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 запустится Блокнот.

Может кто-нибудь объяснить это поведение?

+0

Что такое m_pMainWnd? –

+0

m_pMainWnd - главное окно. Поскольку это приложение диалогового окна, диалоговое окно является основным окном. Эта строка создается мастером MFC. –

ответ

0

Это похоже на временную проблему (в случае если вы установили m_pMainWnd больше очистка делается). Если я добавлю Sleep(300); после ShellExecute, он будет работать. Следует иметь в виду, что некоторые операции ShellExecute могут выполняться асинхронно (например, DDE). Я рассматривал переход на ShellExecuteEx с SEE_MASK_NOASYNC или добавление Sleep перед завершением.

Также не забудьте инициализировать COM, как четко указано в ShellExecute documentation on MSDN.

+0

Включение сна (300) после того, как ShellExecute() устранила проблему. Я попытался использовать ShellExecuteEx() с SEE_MASK_NOASYNC, и поведение такое же, как ShellExecute(). Спасибо за ответ. –