Я пишу мастер-установщик со следующей функцией 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) также не помогло.