手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

win32 运行指定其他的进程

时间:2021/3/29 21:30:30|来源:|点击: 次

WinExec

UINT WinExec(
  LPCSTR lpCmdLine,
  UINT   uCmdShow
);

WinExec官方文档

lpCmdLine

会从一下目录查找对程序

  1. 当前应用启动的文件夹
  2. 当前目录(应用程序启动时可以修改当前目录的位置,和启动目录不是一个概念)
  3. Windows/system 目录(打开你的操作系统安装盘即可查看)
  4. Windwos 目录
  5. 环境变量PATH目录

uCmdShow:
这个用于传给子程序,告诉子程序,父进程想让她如何显示窗口,如最大化SW_MAXIMIZE,最小SW_MINIMIZE.子程序可以在winmain的ncmdshow获取,但是是否采用父进程的显示方式由子进程决定

int WINAPI WinMain(HINSTANCE hinstance,
				   HINSTANCE hprevinstance,
				   LPSTR lpcmdline,
				   int ncmdshow //父进程告诉子进程的所期望的显示效果
				 
				   )
{
	return (0);
 }

返回值
如果大于31标识成功

 UINT winExec = ::WinExec("calc", SW_SHOWNORMAL);

	 if (winExec<31)
	 {
		 cout << "error" << endl;
	 }

ShellExecute

这个函数可以对一个指定的文件做成特定的行为,比如打开一个文件,编辑一个文件。

HINSTANCE ShellExecuteA(
  HWND   hwnd,
  LPCSTR lpOperation,
  LPCSTR lpFile,
  LPCSTR lpParameters,
  LPCSTR lpDirectory,
  INT    nShowCmd
);

ShellExecute文档

hwnd
父窗口句柄可为空

lpOperation

你想对特定传入文件/目录/命令行的执行什么操作。
下面系统提供常用操作字符串

  1. edit 打开lpFile,这里可以是应用程序或者文本
  2. explore 打开文件浏览器去打开lpFile
  3. open 打开一个lpFile 文件
  4. ruas 启动一个程序
  5. find 在lpDirectory处搜索文件
  6. runas 获取管理权限去运行程序

lpFile
要开的文件或者exe

lpParameters

如果lpFile是程序的话,这个这个参数是一个字符串,传递给启动应用程序。

lpDirectory

设置一个工作目录。它的作用有大致两个。

  1. 如果lpFile是一个可执行文件,那么lpDirectory会设置为这个程序的当前目录.(比如打开的程序想要读相对目录下的test.txt,那么这个相对路径是相对于lpDirectory)

  2. lpFile 文件从查找路径

nShowCmd 你想如何显示子窗口,如最大化或最小化

一个小demo:

 HINSTANCE  instance=ShellExecute(NULL, "runas", "Project7.exe", NULL, "C:/Users/fmy/source/repos/Project7", SW_SHOW);
	 if (instance < (HINSTANCE)31)
	 {
		 cout << "error" << endl;
	 }

CreateProcess

BOOL CreateProcessA(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

CreateProcess
这个函数是最复杂也是微软推荐使用的API.

lpApplicationNamelpCommandLine

  1. lpApplicationNamelpCommandLine都不为NULL,情况下:
    lpApplicationName指定可执行文件的路径,lpCommandLine为传入的参数(winmain函数的lpcmdline可以接收,或者main函数的args)

  2. lpApplicationNameNULLlpCommandLine不为NULL
    lpCommandLine用来指定可执行文件的路径,并且可以直接执行环境变量的程序.(如cmd等,但是lpCommandLine无法指定环境变量程序).

  3. lpApplicationName不为NULL,但是lpCommandLine为NULL:
    lpApplicationName指定程序的全路径名字,或者相对路径.但是无法执行环境变量的程序

lpProcessAttributes 参数略 可为null

lpThreadAttributes参数略 可为null

bInheritHandles 参数略 为false即可

lpEnvironment 传入一个环境变量给应用程序,如果为NULL那么使用父进程的环境变量

lpCurrentDirectory 设置程序后它的当前文件路径,比如你的程序想打开一个文件,这个文件路径是相对路径,那么这个相对路径就是相对于lpCurrentDirectory

lpStartupInfo 传入一些启动信息,这里我们不需要传入直接构造LPSTARTUPINFOA 传入即可

lpProcessInformation 回传参数,返回创建的程序一些信息,构造一个LPPROCESS_INFORMATION 传入即可

	STARTUPINFO si = {0,0};
	PROCESS_INFORMATION pi = {0};
	
	BOOL rRet=::CreateProcess(NULL,
		LPSTR("explorer"),//打开文件浏览器
		NULL,
		NULL,
		FALSE,
		0,
		NULL,
		NULL,
		&si,
		&pi
		); 
	if (!rRet)
	{
		cout<<""<<endl;
	}
 	 return EXIT_SUCCESS;

Copyright © 2002-2019 某某自媒体运营 版权所有