我在C ++程序中使用CreateProcess调用来执行运行Java Swing GUI应用程序的JAR文件。所有工作正常,但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结构中设置任何标志,所以我希望通过这样做来实现行为的一致性。任何提示或指示将不胜感激......
Sheldon R.
答案 0 :(得分:0)
好的,我一直在努力解决我的问题,我终于准备好谈论它,因为它似乎正在运行:)我用两种方式之一调用我的Java应用程序:通过弹出一个对话框首先收集登录凭据,或者使用保存的凭据直接调用应用程序。对于登录对话框的情况,我使用参数“javaw ...”调用CreateProcess,而saved-credential情况似乎需要“java ...”以避免应用程序启动最小化。除了参数字符串的不同之外,关于CreateProcess调用的所有其他内容都是相同的。我不知道为什么我会在一个案例中使用“java”而在另一个案例中使用“javaw”,但由于它正在工作,我不会质疑它:)但是,当然,如果有人想要启发这个主题,我很乐意了解更多。感谢@Jim Garrison提出的建议,即使它最终没有解决我的问题......
Sheldon R.
答案 1 :(得分:0)
这是我之前回答的更新:我必须根据上下文以两种不同的方式调用我的java applet(即“java”或“javaw”),这与C ++应用程序中的错误有关。我正在调用我的小程序。我知道这个的原因是因为在修复我的问题几个月之后,发布了这个应用程序的更新版本,并且这个版本没有底层错误,这实际上是因为“java”导致了我的applet中的一个新bug命令做你期望的事情,即除applet窗口之外实例化一个控制台窗口,这让我的业务用户惊讶:)。因此,对于新的无错误版本的C ++应用程序,我使用“javaw”命令调用我的applet,无论是否首先实例化对话框以使用户能够输入登录凭据...
谢尔顿