#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