• C++调用Java的Jar包


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

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


    调用类CJarAppCall。

    JarAppCall.h

    #pragma once
    
    class CJarAppCall
    {
    public:
        CJarAppCall(void);
        ~CJarAppCall(void);
    
        /*
        @brief 运行Jar包调用,等待运行完毕返回
        @param[in] strJarDir jar包文件夹
        @param[in] strJarName jar包名称
        @return 运行是否成功
        */
        bool Run(const CString& strJarDir, const CString& strJarName);
    
    private:
        bool CallApp(const CString& strJarName);
    };
    

    JarAppCall.cpp

    #include "StdAfx.h"
    #include "JarAppCall.h"
    
    CJarAppCall::CJarAppCall(void)
    {
    }
    
    
    CJarAppCall::~CJarAppCall(void)
    {
    }
    
    bool CJarAppCall::Run(const CString& strJarDir, const CString& strJarName)
    {
        //缓存当前文件夹
        WCHAR sOldDir[MAX_PATH] = {0};
        GetCurrentDirectory(MAX_PATH, sOldDir);
    
        //设置当前文件夹为jar包文件夹
        SetCurrentDirectory(strJarDir);
        bool bCalRest = CallApp(strJarName);
        //还原当前文件夹
        SetCurrentDirectory(sOldDir);
    
        return bCalRest;
    }
    
    bool CJarAppCall::CallApp(const CString& strJarName)
    {
        WCHAR sSysDir[MAX_PATH] = {0};
        GetSystemDirectory(sSysDir, MAX_PATH);
        CString strFullPath = sSysDir;
        strFullPath += _T("\cmd.exe");
        CString strCmdLine = _T(" /C ");
        strCmdLine += _T("java -jar ");
        strCmdLine += strJarName;
    
        STARTUPINFO si = {sizeof(si)};
        PROCESS_INFORMATION pi;
        BOOL bRunProgram = CreateProcess(strFullPath.GetBuffer(),
            strCmdLine.GetBuffer(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    
        strFullPath.ReleaseBuffer();
        strCmdLine.ReleaseBuffer();
    
        if (!bRunProgram)
        {
            return false;
        }
    
        // 等待程序结束
        WaitForSingleObject(pi.hProcess,INFINITE);
        CloseHandle(pi.hProcess);
    
        return true;
    }
    

    调用演示样例

    {
        CString strJarDir = _T("F:\JarRunTest");
        CString strJarName = _T("run.jar");
    
        CJarAppCall jarCall;
        if (!jarCall.Run(strJarDir, strJarName))
        {
            //启动失败
            AfxMessageBox(_T("启动失败"));
            return;
        }
        AfxMessageBox(_T("调用完毕"));
    }
    

  • 相关阅读:
    [Luogu] P3258 [JLOI2014]松鼠的新家
    [Luogu] P3701 「伪模板」主席树
    [USACO] 打井 Watering Hole
    [Luogu] P3225 [HNOI2012]矿场搭建
    [USACO06JAN] 冗余路径 Redundant Paths
    [Luogu] P1407 [国家集训队]稳定婚姻
    [USACO06JAN] 牛的舞会 The Cow Prom
    [Luogu] P4254 [JSOI2008]Blue Mary开公司
    [Luogu] P1993 小K的农场
    [Luogu] P2279 [HNOI2003]消防局的设立
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6715686.html
Copyright © 2020-2023  润新知