Newsgroup: it.comp.programmare.win32
Titolo: Problema con ShellExecute

Sto cercando di mandare in esecuzione un programma dall'interno di un altro
e subito recuperare un handle al programma appena avviato. Nonostante il
secondo programma si avvii regolarmente (registrando la sua classe finestra)
quando tendo di recuperare l'handle la funzione FindWindow mi restituisce
NULL. L'ulteriore stranezza è che se rieseguo la funzione (quando cioè il
secondo programma è già avviato) l'handle viene recuperato regolarmente.
Questo è un esempio in cui premendo un pulsante programma2 si avvia
iconizzato e subito tento (senza successo) di portarlo in primo piano
void CMyView::OnButton()
{
    CString s = "c:\\....\programma2.exe";
    if (CWnd::FindWindow("ClassProgramma2",NULL) == NULL)
    {
          HINSTANCE result = ShellExecute(NULL, NULL, sWP, NULL,NULL,
          SW_SHOWNORMAL | SW_MINIMIZE);
    }
    CWnd* pWnd = CWnd::FindWindow("ClassProgramma2",NULL);
    if (pWnd != NULL)
    {
        CWnd *pWndChild;
        pWndChild = pWnd->GetLastActivePopup();
        if (pWnd->IsIconic())
        pWnd->ShowWindow(SW_RESTORE);
        pWndChild->SetForegroundWindow();
   }
}
grazie per l'aiuto
Luke

 iconizzato e subito tento (senza successo) di portarlo in primo piano
La FindWindow fa il suo lavoro correttamente, il tuo è solo un problema di
sincronizzazione...
Se per assurdo (cosa che ti sconsiglio caldamente di fare...) dovessi
piazzare una bella sleep prima di cercare il tuo finestrozzo il tutto
dovrebbe girare, ma non puoi trovare una soluzione univoca al problema, in
quanto non è detto che la finestra venga creata sempre dopo un secondo o
magari due dal momento in cui lanci il tuo exe (con la ShellExecute...),
prova a pensare ad esempio a programmozzi pesanti che prima di partire si
caricano il salamadonna...
Si, ma alura ? Alura usa la CreateProcess che l'è meio...
Spero di essermi spiegato...
Ma ciao !

 Spero di essermi spiegato...
OK grazie alla dritta sono riuscito a risolvere. Ho usato questo codice e
tutto (sembra) funzionare:
void CMyView::OnButton()
{
    CString s = "c:\\....\programma2.exe";
    if (CWnd::FindWindow("ClassProgramma2",NULL) == NULL)
    {
        STARTUPINFO si;
        ::ZeroMemory(&si, sizeof(STARTUPINFO));
        si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_SHOWMINIMIZED;
        PROCESS_INFORMATION pi;
        if (::CreateProcess((LPCTSTR)s, NULL,
            NULL, NULL, FALSE,
            NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
            {
                WaitForInputIdle(pi.hProcess, INFINITE);
                ::CloseHandle(pi.hThread);
                ::CloseHandle(pi.hProcess);
            }
    }
}
...l'unico dubbio è sul secondo parametro di WaitForInputIdle (INFINITE) che
mette un pò paura anche se il programma che mando in esecuzione non richiede
tempi eccessivi per l'inizializzazione.
BYE BYE
Luke

tempi eccessivi per l'inizializzazione.
Non e` obbligatorio mettere INFINITE, ci puoi mettere il timeout che
ti pare.

"Andrea Laforgia" <__walki...@libero.it__> ha scritto nel messaggio
news:kmgitu80skhg3o3rg...@4ax.com...

Ho capito, ma come posso ipotizzare un timeout senza sapere la velocità
della eventuale macchina che manderà in esecuzione il programma ?