2017-02-02 12 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"파일이 없으면 코드가 확인 및 취소 만있는 대화 상자를 엽니 다.

확인을 누르면 대화 상자에서 ShellExecute()가 반환되고 실행됩니다. 메모장이 시작되지 않았습니다. 줄 m_pMainWnd = &dlg;을 주석으로 처리하면 대화 상자가 IDOK와 함께 반환 된 후 메모장이 시작됩니다.

누군가가이 동작을 설명 할 수 있습니까?

+0

m_pMainWnd 란 무엇입니까? –

+0

m_pMainWnd는 기본 창입니다. 이것은 대화 상자 응용 프로그램이므로 대화 상자가 기본 창입니다. 이 줄은 MFC 마법사에 의해 생성됩니다. –

답변

0

타이밍 문제 일뿐입니다 (m_pMainWnd 더 정리가 설정된 경우). ShellExecute 이후에 Sleep(300);을 추가하면 작동합니다. ShellExecute의 일부 연산은 비동기 적으로 수행 될 수 있습니다 (예 : DDE). 나는 SEE_MASK_NOASYNC으로 ShellExecuteEx으로 전환하거나 종료하기 전에 Sleep을 추가하는 것을 고려했다.

또한 ShellExecute documentation on MSDN에 명시된대로 COM을 초기화하는 것을 잊지 마십시오.

+0

ShellExecute() 후에 절전 모드 (300)를 수행하면 문제가 해결되었습니다. SEE_MASK_NOASYNC 함께 ShellExecuteEx() 사용하여 시도하고 ShellExecute() 같은 동작입니다. 답변 해주셔서 감사합니다. –