C/C++执行外部程序(调用外部exe程序)

本文详细介绍了C/C++中调用外部exe程序的两种方法:ShellExecute和CreateProcess。ShellExecute不仅可用于执行程序,还可以打开文件、链接、邮件等,而CreateProcess则提供了更底层的控制,可以设置进程和线程属性。文章通过实例演示了两种方法的使用,并讨论了安全注意事项,特别是如何避免路径解析导致的安全风险。
摘要由CSDN通过智能技术生成
本文只做简单介绍,具体用法请参照MSDN。
  • C中的函数:
1.exec() 函数家族:
exec() 家族的函数将会创建一个新的进程来执行程序。(不能设置权限,只是单纯的传值执行exe)
_execl, _wexecl
_execv, _wexecv
_execle, _wexecle
_execve, _wexecve
_execlp, _wexeclp
_execvp, _wexecvp
_execlpe, _wexeclpe
_execvpe, _wexecvpe

具体使用例子msdn:ms-help://MS.MSDNQTR.v90.chs/dv_vccrt/html/a261df93-206a-4fdc-b8ac-66aa7db83bc6.htm


2.spawn()函数家族:
spawn() 家族的函数将会创建一个新的进程来执行程序。(不能设置权限,只是单纯的传值执行exe)
_spawnl, _wspawnl
_spawnv, _wspawnv
_spawnle, _wspawnle
_spawnve, _wspawnve
_spawnlp, _wspawnlp
_spawnvp, _wspawnvp
_spawnlpe, _wspawnlpe
_spawnvpe, _wspawnvpe
具体使用例子msdn:ms-help://MS.MSDNQTR.v90.chs/dv_vccrt/html/bb47c703-5216-4e09-8023-8cf25bbf2cf9.htm


3.system()函数
可用于执行控制台命令(DOS命令),比如
system("cls");//清屏,等于在DOS上使用cls命令

  • WIN32 API
1.WinExec()函数
只提供16位windows程序使用。(不能设置权限,只是单纯的传值执行exe)
⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow); 
  ⑵ 参数: 
  lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。 
  uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。 
  ⑶ 返回值: 
  若函数调用成功,则返回值大于31。若函数调用失败,则返回值为下列之一: 
  ① 0:系统内存或资源已耗尽。 
  ② ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。 
  ③ ERROR_FILE_NOT_FOUND:指定的文件未找到。 
  ④ ERROR_PATH_NOT_FOUND:指定的路径未找到。 
  虽然Microsoft认为WinExec已过时,但是在许多时候,简单的WinExec函数仍是运行新程序的最好方式。简单地传送作为第一个参数的 命令行,还需要决定如何显示程序(该程序也许会忽视它)的第二个参数。通常,将其设置为SW_SHOW,也可尝试SW_MINIMIZED或 SW_MAXIMIZED。WinExec不允许用CreateProcess获得的所有选项,而它的确简单。

2. ShellExecute () 、 ShellExecuteEx () 后者可以设置以管理员权限运行
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 

⑴标准用法
  ShellExecute函数原型及参数含义如下:  

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters,  LPCTSTR lpDirectory, INT nShowCmd);
  ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。  
  ●lpOperation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。  
  ●lpFileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。  
  ●lpParameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。  
  ●lpDirectory:用于指定默认目录。  
  ●lpShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>

int main( void )
{
HINSTANCE hNewExe = ShellExecuteA(NULL, "open", "d:\\tese.log", NULL, NULL, SW_SHOW);
if ((DWORD)hNewExe <= 32)
{
printf("return value:%d\n", (DWORD)hNewExe);
}
else
{
printf("successed!\n");
}
   printf("GetLastError: %d\n", GetLastError());
system("pause");
return 1;

}

当“D:\\test.log”文件不存在是,执行结果如下:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值