Функции CreateProcess не удается полностью запустить приложение

#c #windows #createprocess

#c #Windows #createprocess

Вопрос:

У меня есть два приложения. Я просто назову их A и B. У меня есть доступ к коду приложения A. Я хочу запустить приложение B и открыть файл в этом приложении из A. Я использую CreateProcess метод для его достижения. Но приложение B не открывается полностью. Я не уверен, существуют ли какие-либо общие библиотеки DLL или другие зависимости между этими двумя приложениями.

Код, который я использую для открытия приложения B формы A, является:

     std::wstring appBPath(L"C:\B.exe");
    std::wstring filePath(L"C:\file.pdf");
    std::wstring cmdLineCommand =  L"""   appBPath  L"" ""   filePath   L""";
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInfo;
    // set the size of the structures
    SecureZeroMemory( amp;startupInfo, sizeof(startupInfo) );
    startupInfo.cb = sizeof(startupInfo);
    SecureZeroMemory( amp;processInfo, sizeof(processInfo) );
    CreateProcess( NULL,    // No module name (use command line)
        amp;cmdLineCommand[0],     // Command line
        NULL,                   // Process handle not inheritable
        NULL,                   // Thread handle not inheritable
        FALSE,                  // Set handle inheritance to FALSE
        CREATE_NEW_CONSOLE,     // New process has a new console
        NULL,                   // Use parent's environment block
        NULL,                   // Use parent's starting directory
        amp;startupInfo,           // Pointer to STARTUPINFO structure
        amp;processInfo );         // Pointer to PROCESS_INFORMATION structure
  

EXE-файл начинает загружаться, но он застревает во время инициализации. Но приложение B не завершается.
Он переходит в какое-то несогласованное состояние. Эта проблема возникает только для приложения A, установленного из его установщика.
Это не происходит, когда я запускаю выпуск или отладочную сборку. Для используемой нами сборки release и debug VC10 . Но для
сборки установщика мы используем VC12 . Я не уверен в оптимизации компилятора, которая существует для сборки установщика.

CreateProcess Функция возвращает успех.

Состояние потока приложения B из process explorer: введите описание изображения здесь

Комментарии:

1. Вы находите B в диспетчере задач? Как выглядит B? Ожидает ли он, чтобы A сделал что-то еще? ProcessExplorer может показать вам состояние всех потоков в B.

2. @user877329 B присутствует в списке диспетчера задач. Я добавил состояние потоков в приложении B

3. @user877329 нашел причину проблемы. Приложение B использует переменную среды, а A присваивает переменной другое значение. И B унаследовал этот блок среды от A. Я думаю, мне придется что-то сделать с переменной lpEnvironment CreateProcess