一个简单需求:用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;
- }
![](http://image104.360doc.com/DownloadImg/2017/03/0709/93239776_3.png)
调用示例
- {
- CString strJarDir = _T("F:\\JarRunTest");
- CString strJarName = _T("run.jar");
-
- CJarAppCall jarCall;
- if (!jarCall.Run(strJarDir, strJarName))
- {
- //启动失败
- AfxMessageBox(_T("启动失败"));
- return;
- }
- AfxMessageBox(_T("调用完成"));
- }
|