0

我在 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 结构中设置任何标志,所以我希望通过这样做来实现行为的一些一致性。任何提示或指示将不胜感激......

谢尔顿·R。

4

2 回答 2

0

好的,我一直在努力解决我的问题,我终于准备好谈论它了,因为它似乎正在工作:) 我调用我的 Java 应用程序的方法有两种:首先弹出一个对话框收集登录凭据,或使用保存的凭据直接调用应用程序。对于登录对话框的情况,我使用参数“javaw ...”调用 CreateProcess,而保存的凭据情况似乎需要“java ...”以避免应用程序启动最小化。除了参数字符串的不同之外,关于 CreateProcess 调用的其他所有内容都是相同的。我不知道为什么我会在一种情况下使用“java”而在另一种情况下使用“javaw”,但既然它有效,我不会质疑它:) 但是,当然,如果有人想对这个主题有所启发,我很乐意了解更多。

谢尔顿·R。

于 2012-02-27T15:33:01.503 回答
0

这是对我之前答案的更新:我必须根据上下文以两种不同的方式(即“java”或“javaw”)调用我的 java 小程序的原因,与我所在的 C++ 应用程序中的一个错误有关调用我的小程序。我之所以知道这是因为在解决我的问题几个月后,发布了该应用程序的更新版本,并且该版本没有底层错误,这实际上导致了我的小程序中的一个新错误,原因是“java”命令执行您所期望的操作,即除了小程序窗口之外还实例化一个控制台窗口,这让我的业务用户大吃一惊:)。因此,对于 C++ 应用程序的新版无错误版本,我使用“javaw”调用我的小程序

谢尔顿

于 2012-08-03T18:30:41.153 回答