在網上看了一圈,只有一個示例代碼,並且運行有錯誤,下面給出正確代碼:java
JarAppCall.hios
1 #pragma once 2 3 4 class CJarAppCall 5 { 6 public: 7 CJarAppCall(void); 8 ~CJarAppCall(void); 9 10 /* 11 @brief 執行Jar包調用,等待執行完成返回 12 @param[in] strJarDir jar包目錄 13 @param[in] strJarName jar包名稱 14 @return 執行是否成功 15 */ 16 bool Run(const CString& strJarDir, const CString& strJarName); 17 18 private: 19 bool CallApp(const CString& strJarName); 20 };
JarAppCall.cppwindows
1 #include "StdAfx.h" 2 #include "JarAppCall.h" 3 4 CJarAppCall::CJarAppCall(void) 5 { 6 } 7 8 9 CJarAppCall::~CJarAppCall(void) 10 { 11 } 12 13 bool CJarAppCall::Run(const CString& strJarDir, const CString& strJarName) 14 { 15 //緩存當前目錄 16 WCHAR sOldDir[MAX_PATH] = {0}; 17 GetCurrentDirectory(MAX_PATH, sOldDir); 18 19 //設置當前目錄爲jar包目錄 20 SetCurrentDirectory(strJarDir); 21 bool bCalRest = CallApp(strJarName); 22 //還原當前目錄 23 SetCurrentDirectory(sOldDir); 24 25 return bCalRest; 26 } 27 28 bool CJarAppCall::CallApp(const CString& strJarName) 29 { 30 WCHAR sSysDir[MAX_PATH] = {0}; 31 GetSystemDirectory(sSysDir, MAX_PATH); 32 CString strFullPath = *sSysDir; 33 strFullPath += _T(":\\cmd.exe"); 34 CString strCmdLine = _T(" /C "); 35 strCmdLine += _T("java -jar "); 36 strCmdLine += strJarName; 37 38 STARTUPINFO si = {sizeof(si)}; 39 PROCESS_INFORMATION pi; 40 BOOL bRunProgram = CreateProcess(strFullPath.GetBuffer(), 41 strCmdLine.GetBuffer(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 42 43 strFullPath.ReleaseBuffer(); 44 strCmdLine.ReleaseBuffer(); 45 46 if (!bRunProgram) 47 { 48 return false; 49 } 50 51 // 等待程序結束 52 WaitForSingleObject(pi.hProcess,INFINITE); 53 CloseHandle(pi.hProcess); 54 55 return true; 56 }
這裏要注意,33行是:\\cmd.exe,其餘網站漏掉了冒號;並且這樣設置路徑就要在windows/system32下把cmd.exe複製到C盤根目錄下。緩存
main.cpp網站
1 #include "afx.h" 2 #include <WinDef.h> 3 #include <string> 4 #include <wchar.h> 5 #include <tchar.h> 6 #include <iostream> 7 #include "JarAppCall.h" 8 using namespace std; 9 10 int main() 11 { 12 CString strJarDir = _T("D:\\ICBCdriverJAVA1\\ICBCdriverJAVA1"); 13 CString strJarName = _T("ChinaBank.jar"); 14 15 CJarAppCall jarCall; 16 if (!jarCall.Run(strJarDir, strJarName)) 17 { 18 //啓動失敗 19 printf("fail!"); 20 return -1; 21 } 22 }
這裏最好把提示信息的那個AfxMessageBox(_T("啓動失敗")); 刪掉,容易報錯。字符集最好設置爲Unicode。MFC使用設置爲在共享DLL中使用MFC(可能由於CString是MFC的東西,這個不是太懂,看網上的帖子摸索出來的)。spa