VS2010 C++调用Java的Jar包
在网上看了一圈,只有一个示例代码,而且运行有错误,下面给出正确代码:
JarAppCall.h
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.cpp
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的东西,这个不是太懂,看网上的帖子摸索出来的)。