用ShellExecuteEx函数执行一个vc写的exe,vc程序的返回函数是return(n)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用ShellExecuteEx函数执行一个vc写的exe,vc程序的返回函数是return(n)相关的知识,希望对你有一定的参考价值。
n是vc程序的返回值,我怎样得到n的值呢?
用shellexecute这个api获取到它所执行程序完成后的返回值,是.exe。顺便能编写一个简单的exe可执行的么
STARTUPINFO si=sizeof(si);
PROCESS_INFORMATION pi;
si.dwFlags=STARTF_USESHOWWINDOW;//指定wShowWindow成员有效
si.wShowWindow=TRUE;//此成员设为TRUE的话则显示新建进程的主窗口
BOOL bRet=CreateProcess(
L"xx:\\xx.exe",//目标文件名
NULL,
NULL,//默认进程安全性
NULL,//默认进程安全性
FALSE,//指定当前进程内句柄不可以被子进程继承
CREATE_NEW_CONSOLE,//为新进程创建一个新的控制台窗口
NULL,//使用本进程的环境变量
NULL,//使用本进程的驱动器和目录
&si,
&pi);
if (bRet)
DWORD dwExitCode;
CloseHandle(pi.hThread);
DWORD dwResult=WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
printf("%d\n",dwResult);
printf("%d\n",dwExitCode);
以上代码是执行目标exe,等待其退出,得到main函数的返回值,用的是CreateProcess
需要#include <Windows.h>
如何使用 ShellExecuteEx 传递参数?
【中文标题】如何使用 ShellExecuteEx 传递参数?【英文标题】:How to pass arguments with ShellExecuteEx? 【发布时间】:2017-06-27 10:38:56 【问题描述】:我将 IPC 用于共享内存。
我需要用 IPC 打开另一个程序,但我想知道如何传递参数。
下面是我的 IPC 类的执行函数。
int execute(std::string exePath, std::string exeName, int console = 1)
SHELLEXECUTEINFOA p_info;
ZeroMemory(&p_info, sizeof(SHELLEXECUTEINFOA)); //초기화
p_info.cbSize = sizeof(SHELLEXECUTEINFOA);
p_info.lpFile = exeName.c_str(); // 파일 이름
p_info.lpDirectory = exePath.c_str(); //파일 위치
p_info.nShow = console; //콘솔 show
p_info.fMask = SEE_MASK_NOCLOSEPROCESS;
return ShellExecuteEx(&p_info);
;
【问题讨论】:
您可以使用lpParameters
成员或SHELLEXECUTEINFO
,但是如果您不需要提升 - 最好使用Createprocess
而不是ShellExecuteEx
【参考方案1】:
使用SHELLEXECUTEINFO
的lpParameters
成员传递参数。
其他一些cmets:
由于您显式使用 ANSI 版本的结构SHELLEXECUTEINFOA
,因此对函数调用执行相同操作并使用 ShellExecuteExA
是合适的。
通过将结构初始化为声明的一部分来避免调用ZeroMemory
:SHELLEXECUTEINFOA p_info = 0 ;
您使用SEE_MASK_NOCLOSEPROCESS
但未能关闭进程句柄。这是句柄泄漏。
除非您使用ShellExecuteEx
和runas
动词来提升进程,否则调用CreateProcess
似乎更合适。既然可以直接打电话给CreateProcess
,为什么还要叫ShellExecuteEx
?
【讨论】:
以上是关于用ShellExecuteEx函数执行一个vc写的exe,vc程序的返回函数是return(n)的主要内容,如果未能解决你的问题,请参考以下文章