2012-02-13 171 views
0

我在C++程序內使用CreateProcess調用來執行運行Java Swing GUI應用程序的JAR文件。所有的工作都很好,除了Java應用程序的啓動最小化之外,我希望它以顯示的窗口開始。下面是相關的代碼片段:用於運行JAR文件的CreateProcess最小化窗口開始

// 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.

+0

您是使用AWT還是Swing來顯示窗口?如果是這樣,'JFrame#setState()'是你正在尋找的。 – 2012-02-13 17:48:47

+0

我還沒有試過你的建議,Jim,因爲我一直在C++方面玩耍。我所看到的是,如果在執行CreateProcess調用之前添加一個MessageBoxA調用來顯示一些調試信息,那麼該窗口就會很好,而不是被最小化。在C++世界中有沒有一種方法可以驅除機器中的這個鬼魂? – 2012-02-13 20:17:12

+0

更新:我編輯我的問題,包括顯示CreateProcess調用的代碼,以及我將startupinfo.cb設置爲該結構的大小的語句,因爲我在讀取另一個重要的問題的評論中。此外,我發現使用命令「java」而不是「javaw」(顯示控制檯輸出的命令窗口)也會導致顯示應用程序窗口而不是最小化。有關我的代碼的C++部分可能會丟失什麼的想法? – 2012-02-13 21:39:15

回答

0

這是一個更新到我以前的答案:我之所以不得不打電話我的Java小程序有兩種不同的方式(即「java」或「javaw」),這取決於上下文,這與我從中調用我的小程序的C++應用程序中的錯誤有關。我知道這是因爲在解決我的問題幾個月後,這個應用程序的更新版本發佈了,這個版本沒有基本的錯誤,這實際上導致了我的applet中的一個新的錯誤,由於「java」命令做你期望的事情,即除了applet窗口之外還實例化一個控制檯窗口,這對我的業務用戶來說是意外的:)。因此,對於C++應用程序的新無bug版本,我使用「javaw」命令調用我的小程序,而不管是否首先實例化對話框以使用戶能夠輸入登錄憑證...

Sheldon

0

好吧,我一直在努力解決我的問題,我終於可以談論它,因爲它似乎是工作:)我打電話給我的Java應用程序以下兩種方式之一:通過首先彈出一個對話框來收集登錄憑據,或通過直接使用保存的憑據調用應用程序。對於登錄對話框的情況,我使用參數「javaw ...」調用CreateProcess,而保存的憑證情況似乎需要「java ...」以避免應用程序啓動時最小化。除了參數字符串的區別之外,關於CreateProcess調用的所有其他內容都是相同的。我不知道爲什麼我會在一個案例中使用「java」,而在另一個案例中使用「javaw」,但由於它的工作原理,我不會質疑它:)但是,當然,如果有人想要就這個問題進行啓發,我很樂意學習更多。由於@Jim駐軍的建議,即使是不能最終解決我的問題......

謝爾頓R.