Windows API - ShellExecuteEx () не ждал на USB-накопителе и компакт-диске - PullRequest
1 голос
/ 30 октября 2010

Я пишу мастер-установщик со следующей функцией ShellExecuteEx (), которая вызывает несколько созданных программой установки Advanced (установщик нескольких продуктов) один за другим через конструкцию цикла.

// Shell Execute 
bool CFileHelper::ShellExecute(CString strCommandPath, CString strOptions)
{

    CString strQCommandPath = CString(_T("\"")) + strCommandPath +  CString(_T("\""));  //place the command in the quote to handle path with space

    LPWSTR szInstallerPath = strQCommandPath.GetBuffer();
    LPWSTR szOptions = strOptions.GetBuffer(MAX_PATH);

    SHELLEXECUTEINFO ShellInfo; // Name structure

    memset(&ShellInfo, 0, sizeof(ShellInfo)); // Set up memory block
    ShellInfo.cbSize = sizeof(ShellInfo); // Set up structure size
    ShellInfo.hwnd = 0; // Calling window handle
    ShellInfo.lpVerb = _T("open"); 
    ShellInfo.lpFile = szInstallerPath; 
    ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS; //| SEE_MASK_NOASYNC | SEE_MASK_WAITFORINPUTIDLE;
    ShellInfo.lpParameters = szOptions;
    bool res = ShellExecuteEx(&ShellInfo); // Call to function
    if (!res)
    {
        //printf( "CreateProcess failed (%d).\n", GetLastError() );
        CString strMsg = CString(_T("Failed to execute command ")) + strCommandPath +  CString(_T("!"));
        AfxMessageBox(strMsg);
        return false;
    }

    WaitForSingleObject(ShellInfo.hProcess, INFINITE); // wait forever for process to finish
    //WaitForInputIdle(ShellInfo.hProcess, INFINITE);

    CloseHandle( ShellInfo.hProcess);

    strQCommandPath.ReleaseBuffer();
    strOptions.ReleaseBuffer();
    return true;
}

Функция работает каждыйхорошо, когда у меня есть этот основной установщик и другие отдельные установщики продукта на жестком диске.

Однако, если я перенесу их все на USB-накопитель или компакт-диск, ShellExecuteEx () не дождется, пока предыдущий установщик продукта не выполнит свою задачу.Таким образом, все установщики продукта получают обед сразу;выдает мне сообщение об ошибке «Идет другая установка. Вы должны завершить эту установку, прежде чем продолжить эту.».

Одна загадка меня - почему она работает на жестком диске, а не на USB-накопителе и компакт-диске.Мне нужно распространять продукты на CD.

Помещение Sleep (500) до того, как WaitForSingleObject (ShellInfo.hProcess, INFINITE) также не помогло.

1 Ответ

2 голосов
/ 30 октября 2010

Работа исходя из предположения, что это реально. Установщик мог заметить, что он был запущен со съемного диска и скопировал себя на жесткий диск. Запустил эту копию и вышел. Это позволяет избежать проблем, когда пользователь извлекает носитель, что приводит к ошибке подкачки на очень низком уровне, которую сам процесс не может уловить. Диалог Windows невелик и может хорошо идти вразрез с запросом установщика вставить следующий диск.

Проверьте это предположение, сравнив идентификатор процесса, который вы запустили, с тем, который вы видите в Taskmgr.exe. Надежное исправление должно быть головной болью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...