一个简单需求:用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); };
#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("调用完成")); }
原文地址:http://blog.csdn.net/segen_jaa/article/details/28634877