CreateProcess для запуска файла JAR начинается с свернутого окна - PullRequest
0 голосов
/ 13 февраля 2012

Я использую вызов CreateProcess в программе на C ++ для выполнения JAR-файла, который запускает приложение Java Swing GUI. Все работает нормально, за исключением того, что приложение Java запускается в свернутом виде, и я хочу, чтобы оно начиналось с отображаемого окна. Вот соответствующий фрагмент кода:

// Construct the command string to be used for the CreateProcess call,
//including a parameter string
sprintf(cmdStr, "javaw -jar \"AppDir\\App.jar\" %s", parmStr);

// Create and initialized startup-info structure for use with CreateProcess call
STARTUPINFO startInfo;
ZeroMemory(&startInfo, sizeof(startInfo));

startInfo.wShowWindow = SW_NORMAL;
startInfo.dwFlags = STARTF_USESHOWWINDOW;
startInfo.cb = sizeof(startInfo);
PROCESS_INFORMATION procInfo;
ZeroMemory(&procInfo, sizeof(procInfo));

if (!CreateProcess(NULL, cmdStr, NULL, NULL, FALSE, 0, NULL, NULL, &startInfo,  &procInfo))
{
   MessageBox( dialogOwner, "Create Process Error", "Application not instantiated", MB_OK);
}

Согласно литературе MSDN, установка флага wShowWindow в SW_NORMAL и dwFlags в STARTF_USESHOWWINDOW должна помочь, но некоторые комментарии, которые я читал на этом и других форумах подразумевается, что иногда эти флаги игнорируются (например, для консольных приложений), поэтому мне было интересно, если это было здесь. Для справки, у меня была эта проблема до того, как она ушла сама по себе, и теперь она вернулась после того, как я сделал некоторые изменения в коде. Но я не устанавливал никаких флагов в структуре startupinfo раньше, поэтому я надеялся добиться некоторой согласованности в поведении. Любые советы или указатели будут оценены ...

Шелдон Р.

Ответы [ 2 ]

0 голосов
/ 03 августа 2012

Это обновление к моему предыдущему ответу: причина, по которой мне пришлось вызывать свой java-апплет двумя разными способами (т.е. «java» или «javaw») в зависимости от контекста, была связана с ошибкой в ​​приложении C ++ изкоторый я назвал моей апплет.Причина, по которой я это знаю, состоит в том, что через несколько месяцев после исправления моей проблемы была выпущена более новая версия этого приложения, и в этой версии не было основной ошибки, которая по существу вызвала новую ошибку в моем апплете из-за "java"команда делает то, что вы ожидаете, т.е. создаете окно консоли в дополнение к окну апплета, к большому удивлению моих бизнес-пользователей :).Поэтому для новой версии приложения C ++ без ошибок я вызываю свой апплет с помощью команды «javaw» независимо от того, было ли сначала создано диалоговое окно, чтобы позволить пользователю ввести учетные данные для входа в систему ...

Шелдон

0 голосов
/ 27 февраля 2012

Хорошо, я работаю над решением своей проблемы, и я наконец-то готов поговорить об этом, так как он, кажется, работает :) Я вызываю свое Java-приложение одним из двух способов: Сначала откройте диалоговое окно, чтобы собрать учетные данные для входа в систему, либо позвонив в приложение напрямую, используя сохраненные учетные данные. В случае диалога входа в систему я вызываю CreateProcess с параметром «javaw ...», тогда как в случае сохраненных учетных данных требуется «java ...», чтобы избежать минимизации запуска приложения. Помимо различий в строке параметров, все остальное в вызове CreateProcess остается тем же. Я не знаю, почему я использовал бы «java» в одном случае и «javaw» в другом, но так как это работает, я не буду подвергать сомнению это :) Но, конечно, если кто-то хочет просветить по этому вопросу, Я был бы счастлив узнать больше. Спасибо @Jim Garrison за предложение, даже если в конечном итоге оно не решило мою проблему ...

Шелдон Р.

...