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的东西,这个不是太懂,看网上的帖子摸索出来的)。

 

posted @ 2016-07-31 19:42  Rivrr  阅读(5922)  评论(1编辑  收藏  举报