zoukankan      html  css  js  c++  java
  • 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的东西,这个不是太懂,看网上的帖子摸索出来的)。

  • 相关阅读:
    mybatis-plus物理分页插件使用
    mybatis-plus提供支持ActiveRecord模式
    mybatis-plus通用Service
    mybatis-plus返回查询总记录数
    Mybatis-Plus查询返回Map类型数据
    Mybatis-Plus条件构造器condition动态判断条件
    Mybatis-Plus条件构造器select方法返回指定字段
    mybatis-plus条件构造器UpdateWrapper实例
    mybatis-plus条件构造器QueryWrapper实例
    这玩意比ThreadLocal叼多了,吓得why哥赶紧分享出来。
  • 原文地址:https://www.cnblogs.com/Rivrr/p/5723737.html
Copyright © 2011-2022 走看看