2017-02-02 3 views
1

J'ai essayé d'écrire une courte application de base de données Visual Studio C++ MFC et de rencontrer un comportement étrange en utilisant ShellExecute().Comportement étrange dans Visual C++ ShellExecute() fonction

#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; 
} 

Si le fichier "config.ini" existe, le code passe directement à ShellExecute() et Bloc-notes démarre bien.

Lorsque le fichier "Config.ini" n'existe pas, le code ouvre une boîte de dialogue avec uniquement OK et Annuler.

Après avoir appuyé sur OK, la boîte de dialogue renvoie et exécute ShellExecute(). Le bloc-notes n'a pas démarré. Si je commente la ligne m_pMainWnd = &dlg;, puis après le retour de la boîte de dialogue avec IDOK, le Bloc-notes démarre.

Quelqu'un peut-il expliquer ce comportement?

+0

Qu'est-ce que m_pMainWnd? –

+0

m_pMainWnd est la fenêtre principale. Comme il s'agit d'une application de boîte de dialogue, la boîte de dialogue est la fenêtre principale. Cette ligne est générée par l'assistant MFC. –

Répondre

0

Cela semble être juste un problème de synchronisation (dans le cas où vous définissez m_pMainWnd plus de nettoyage est fait). Si j'ajoute un Sleep(300); après ShellExecute cela fonctionne. Vous devez garder à l'esprit que certaines opérations de ShellExecute peuvent être effectuées de manière asynchrone (par exemple, DDE). Je pourrais envisager de passer à ShellExecuteEx avec SEE_MASK_NOASYNC ou d'ajouter un Sleep avant de terminer.

Veuillez également ne pas oublier d'initialiser COM comme indiqué clairement dans le ShellExecute documentation on MSDN.

+0

Mettre Sleep (300) après que ShellExecute() a résolu le problème. J'ai essayé d'utiliser ShellExecuteEx() avec SEE_MASK_NOASYNC et le comportement est le même que ShellExecute(). Merci d'avoir répondu. –