C++中外部程序的调用

Visual Studio 2022 C++ 调用matplotlib-cpp 绘图 利用matplotlib-cpp在Visual Studio 2022中绘图 阅读详情

有三种SDK函数可以调用,分别是:

WinExec, ShellExecute,CreateProcess

 其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。

WinExec 有两个参数,前一个指定路径,后一个指定显示方式。

ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。

CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,就需要使用CreateProcess函数了。

具体用法如下:

WinExec

    这个函数最简单,只有两个参数,原型如下:


      UINT WinExec(
    

      LPCSTR lpCmdLine,   // 命令路径

      UINT uCmdShow      // 显示方式,共有11种,具体可以查阅MSDN的ShowWindow函数

      );

         使用方法如下:

     WinExec("Notepad.exe", SW_SHOW);  // 打开记事本


     WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe(注意文件名的大小写也必须完全一样)


      需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Calc (计算器),就不会出现正常的窗体,但是已经被加到任务列表里了。

       

ShellExecute

原型如下:

      HINSTANCE ShellExecute(

           HWND hwnd,           //父窗口句柄

      LPCTSTR lpOperation,   //操作, 打开方式"edit","explore","open","find","print","NULL"

      LPCTSTR lpFile,         //文件名,前面可加路径

      LPCTSTR lpParameters,   //参数

      LPCTSTR lpDirectory,    //默认文件夹

      INT nShowCmd          //显示方式

);

使用方法如下:

      ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:/Test.txt 文件


      ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com


      ShellExecute(NULL,"explore", "D://C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:/C++


      ShellExecute(NULL,"print","C://Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:/Test.txt

      注意:ShellExecute不支持定向输出。

CreateProcess

原型如下:

      BOOL CreateProcess(

         LPCTSTR lpApplicationName, //执行程序名

     LPTSTR lpCommandLine,  // 参数行

      //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性

      LPSECURITY_ATTRIBUTES lpProcessAttributes,  //process security attributes

       LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes

       BOOL bInheritHandles,  // 继承标志

      DWORD dwCreationFlags, // 创建标志

      LPVOID lpEnvironment,  // 环境变量

      LPCTSTR lpCurrentDirectory,   // 运行该进程的初始目录

      LPSTARTUPINFO lpStartupInfo,  // 用于在创建子进程时设置各种属性

      LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息

      );

        使用方法如下:
          PROCESS_INFORMATION pi;  //启动窗口的信息
          STARTUPINFO si;  //进程的信息
          memset(&si,0,sizeof(si));
          si.cb=sizeof(si);
          si.wShowWindow=SW_SHOW;
          si.dwFlags=STARTF_USESHOWWINDOW;
          bool fRet=CreateProcess("D://putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);

        由此,我就设计了三个按钮,分别用这三种函数调用了三个应用程序,设置在每个按钮的ONCLICK消息中:

        WinExec("taskmgr",SW_NORMAL); //调用系统任务管理器

        ShellExecute(NULL,"open","C:/ReadMe.txt","","",SW_SHOW); //打开C盘下的ReadMe文件

        STARTUPINFO si={sizeof(si)};
        PROCESS_INFORMATION pi;
        CreateProcess(NULL,"cleanmgr",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); //调用系统的清理磁盘程序

        编译运行后都通过了,我的对话框终于有了一点用处,可以通过单击按钮执行一些应用程序了。

        从网上看到有人说,使用这三个函数也有一些注意事项:

        1、定义头文件

    在头文件stdafx.h中必须定义以下两个头文件:

       #include <shlobj.h> // 可替换为 windows.h
       #include <shellapi.h>
    如果定义了头文件 #include <windows.h>的话就不必定义 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

 
      2、定义路径

    C++中所表示的路径要用 " // "而不是平常所用的" / ",所以以上三个函数表示路径都为:

Disk://Directory//...//File name

C++ 一个函数调用其他.cpp文件中的函数 使用VC或VS创建C++项目的时候,会自动产生许多文件夹,其中有一个文件夹->源文件: 在该文件下可以自定义许多.cpp文件,但是需要注意的是这里面的各个文件只能有一个文件中含有main()函数, 而且各个文件中不能使用相同的函数名进行定义; 那么要那么多文件放在项目中有什么用呢? 当然这里C++是提供一个文件调用其他文件中函数的功能的, 这就可以让我们自定义一个只包含main()... 阅读详情

相关推荐

在Android Studio中调用C++程序

一、在安卓中创建C++原生代码 1.file -> new project -> native C++ :然后一切选择默认; 列子项目名称为Mytest1,创建成功如下图:点击红圈部分 2.进入到下面的界面勾选NDK、CMake(有LLDB的,也可以勾选,没有就算了),若为Not installed,直接在这里下载就好,下载好了,点击apply,ok,status栏其为installed即可 点击project 3.打开native-lib.cpp 将下图红线部分修改为下图的代码即

Kazinshy的博客 8193

C++中外部程序的调用方法

http://www.vip-tarena.com/C__peixun/440.html

Tiancaizhaohaiwei的博客 570

WebRTC开源库内部调用abort函数引发C++程序发生闪退问题的详细排查

本文讲述WebRTC开源库内部调用abort函数引发程序发生闪退问题的详细排查过程。

dvlinker的技术专栏 2万+

【C++】C程序和C++程序之间的互相调用

手把手教你C和C++之间的相互调用

Lin5200000的博客 4698

C++利用cpp-libffi库实现跨平台的外部函数接口调用

C++ Libffi 是一个用于调用动态库中函数的库,它提供了一种机制,允许程序员在运行时调用任意函数,而无需在编译时知道函数的签名。它广泛用于多种编程语言和平台,特别是在需要动态链接和调用外部函数库的场景中。调用约定定义了函数调用时参数如何传递、哪些寄存器被调用者保存以及返回值如何传递的规则。在不同的平台和编程语言中,这些规则可能有所不同,例如x86平台和ARM平台就有不同的调用约定。理解调用约定对于跨语言交互尤其重要,因为不同的调用约定可能导致参数传递方式和函数调用栈的清理方式不同。

weixin_35899324的博客 1190

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 387

C语言--C++调用C语言程序、C语言调用C++程序

1、C++中调用C语言程序 main.cpp文件 #include <iostream> #include "cfun.h" using namespace std; int main() { cout << "C++ Hello world!" << endl; cfun(); return 0; } #if 0 ou...

tyustli 757

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 925

简单的Python调用C++程序

Python调用C/C++程序的方法 最近写BUG的时候遇到python计算很慢的情况,于是调研了一波在python中嵌入C++程序的方法,记录一下,便于查询。 一般来说在python调用C/C++程序主要可以分为3步: 1、编写C/C++实现程序。 2、将C/C++程序编译成动态库。 3、在Python中调用编译生成的库。 Python在调用C/C++程序时有一些不同,需要注意。 1、Python调用C函数 Python调用C语言程序比较简单,将C语言程序编译好,再使用python中的ctypes模块

weixin_40313940的博客 7350

Solidworks转URDF避坑实录:从履带机器人到ROS仿真的完整配置流程

本文详细介绍了将Solidworks履带机器人模型转换为URDF格式并配置ROS仿真的完整流程,重点解析了坐标系设置、复杂关节定义、插件配置等关键步骤中的常见问题与解决方案,帮助开发者高效实现履带机器人在RVIZ和Gazebo中的精确仿真。

weixin_30693683的博客 457

南京邮电大学《数学实验》模块二(函数的迭代)参考答案

【代码】南京邮电大学《数学实验》模块二(函数的迭代)参考答案。

qq_1293730064的博客 3万+

如何在C++程序(工程)中调用Matlab函数

C++调用Matlab主要有两种方式,一种是调用Matlab的计算引擎,即调用Matlab本身;另一种是调用matlab中由mcc编译生成的dll文件,这种方法是Matlab利用C++ Complier将m文件转化为C++源码,产生能够完全脱离Matlab运行环境独立执行的DLL程序,从而能够在C++程序中调用DLL实现对Matlab代码的利用。 不过,需要说明的是,C++的编译速度是要比Mat...

小武的博客 7095

WordPress主题开发实战:从零开始手把手教你创建自定义主题(含常用函数大全)

本文是一份WordPress主题开发实战指南,从零开始手把手教你创建自定义主题。内容涵盖主题核心文件结构、模板层级与循环机制、函数与钩子的运用,并附有详细的常用函数大全,帮助开发者彻底掌握主题开发的核心技能,实现从使用者到创造者的转变。

weixin_27943395的博客 256

C++ 主程序如何调用其他程序文件

文章摘要: C++项目中,主程序(如main.cpp)通常通过头文件(.h)和源文件(.cpp)的分工机制调用其他模块化文件。头文件声明函数、类或变量,充当接口;源文件实现具体功能。这种模块化设计提升代码可读性、复用性和协作效率,同时优化编译速度。核心原则是“高内聚、低耦合”,主程序仅需了解功能接口而非实现细节。常见问题如重复定义可通过规范头文件(仅声明)与源文件(实现分离)避免。现代实践(如C++20模块)进一步优化该流程。掌握跨文件调用能力是工程化开发的关键标志。

qq_39980997的博客 1342

理解ADC:为什么需要抗混叠滤波器?

本文介绍 ADC 的混叠现象,引出抗混叠滤波器,并介绍一种开关电容滤波器,它具有很小的增益过渡带。

疯狂的运放 5939

matlab 点云按高程进行赋色【2024最新版】

首先按照Z轴方向求取所在点云的高程极值(包括高程最大值与最小值),然后将高程归一化到0~255范围内,最后采用matlab中的colormap颜色渲染函数进行赋色并保存渲染结果到点云。

点云侠的博客 3341

cpp调用java_C++调用java

摘要:1 java类生成c头文件和库文件2 对于c/c++程序,启动时先启动jvm,然后获得对应的java类的对象和方法。然后正常使用。最近正在做一个C/C++调用java的程序,这里说的调用java不是使用方式 exec(/path/to/java,.....),而是调用一个class文件中的一个特定的函数。实践后总结如下:1. 安装 jdk2. 安装gcc(linux自带有的就无需安装了)利用...

weixin_34676685的博客 517

YOLOv11改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv11的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 2207

cpp 程序调用 c 程序(extern “C“ 的使用)

.cpp 文件调用 .c 文件中的函数

challenglistic的博客 2934

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

从 C/C++ 程序调用 Java 代码

JNI允许您从本机代码内调用 Java 类方法。 要做到这一点,通常必须使用 Invocation API 在本机代码内创建和初始化一个 JVM。 下列是您可能决定从 C/C++ 代码调用Java 代码的典型情况:     1.希望实现的这部分代码是平台无关的,它将用于跨多种平台使用的功能。     2.需要在本机应用程序中访问用 Java 语言编写的代码或代码库。     3.希望从本

老徐2014 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【亲测免费】 restclient-cpp: 简化C++中REST API的调用

是一个轻量级且易于使用的C++库,用于简化对RESTful APIs的调用。它的目的是通过提供简洁、高效的API接口,帮助开发人员快速地将HTTP请求与响应集成到自己的应用程序中。 ## 项目简介 restclient-cpp 库支持多种HTTP方法(如GET、POST、PUT、DELETE等)以及自定义头部信息。它还提供了方便的功能,例如自动处理JSON编码/解码以及URL编码。该库适用于各...

gitblog_00004的博客 1666

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python调用cpp文件_Python调用C/C++ 亲测可用版

新建一c++文件:如test1.cpp(这个简单的例子只是输入两个数字,再打印出来)在cmd窗口中进入该文件所在目录,输入:g++ -o test1.so -shared -fPIC test1.cpp-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件。-fPIC:表示编译为位置独立的代码...

weixin_39744408的博客 3325

c++调用其他cpp文件的函数

c++程序中,如果将所有的函数和代码都放在同一个文件中,势必会非常臃肿,后期也不好维护,小项目还好,大项目就GG了;所以将函数进行分类就很有必要,在这里我将用2种方法来调用其他文件中的函数。

叶新东老师的博客 1411

JNI调用CPP程序

创建JNITest类,并包含一个未定义的native方法shit() cmd窗口中cd 到项目的src目录下(此处可能根据jdk等版本有差异?),并执行javah -jni practice.JNITest(类的全限定类名 ) : 执行成功后在项目的bin目录下会生成相应的JNI头文件: 该头文件中引入了一个JNI头文件,之后会说,同时该头文件定义了JNITest类中需要在cpp中被实现的native方法,注意需要在此处同时include一个jni_md.h的头文件,否则JNIEXPORT会报错,同样一

qq_33804124的博客 721
上一篇: C++集成设计环境——Code::Blocks 安装
下一篇: "指环王"中那个白色头发、擅长用弓箭的精灵族男子
evilmojo
博客等级 码龄18年 16粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值