分享

C++调用Java的Jar包

 陈永正的图书馆 2017-03-07

一个简单需求:用C++调用Jar包。

实现基本思路:调用CreateProcess API来启动cmd.exe运行jar包。


调用类CJarAppCall。

JarAppCall.h

  1. #pragma once  
  2.   
  3. class CJarAppCall  
  4. {  
  5. public:  
  6.     CJarAppCall(void);  
  7.     ~CJarAppCall(void);  
  8.   
  9.     /* 
  10.     @brief 执行Jar包调用,等待执行完成返回 
  11.     @param[in] strJarDir jar包目录 
  12.     @param[in] strJarName jar包名称 
  13.     @return 执行是否成功 
  14.     */  
  15.     bool Run(const CString& strJarDir, const CString& strJarName);  
  16.   
  17. private:  
  18.     bool CallApp(const CString& strJarName);  
  19. };  

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

调用示例

  1. {  
  2.     CString strJarDir = _T("F:\\JarRunTest");  
  3.     CString strJarName = _T("run.jar");  
  4.   
  5.     CJarAppCall jarCall;  
  6.     if (!jarCall.Run(strJarDir, strJarName))  
  7.     {  
  8.         //启动失败  
  9.         AfxMessageBox(_T("启动失败"));  
  10.         return;  
  11.     }  
  12.     AfxMessageBox(_T("调用完成"));  
  13. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多