c++中用system调用一个叫set的程序
在c++中,system("abc")就会调用当前目录下一个叫abc的可执行文件。但如果这个程序叫set.exe,使用ststem("set"),它却显示了系统的环境变量...
在c++中,system("abc")就会调用当前目录下一个叫abc的可执行文件。
但如果这个程序叫set.exe,使用ststem("set"),它却显示了系统的环境变量。
我想调用当前目录下的这个set.exe文件,应该如何写? 展开
但如果这个程序叫set.exe,使用ststem("set"),它却显示了系统的环境变量。
我想调用当前目录下的这个set.exe文件,应该如何写? 展开
4个回答
展开全部
在C++里面直接调用exe文件的方法有哪些呢?现在可考虑的方法主要有:
a.使用system函数
b.使用exec或者是execv函数
c.使用WinExec函数
d.使用CreateProcess函数
e.使用ShellExcecuteEx函数
1)
上面的5中方法中,system函数,函数原型system(执行shell命令)定义函数是,int system(const char * string),可以调用一些DOS命令,比如:
system("cls");//清屏,等于在DOS上使用cls命令
system函数会调用fork()函数产生子进行横,由子进程来调用/bin/sh-c
string来执行参数string字符串所代表的命令,此命令执行完后随即返回调用的进程,system函数不能控制程序窗口是否显示。一般在项目中,这种方法不予考虑。
2)使用execl或execv函数
这是exec函数族里面的两个函数,在UNIX环境下用的比较多,exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,
也就是说在调用进程内部执行一个可执行文件,这里的可执行文件既可以是二进制文件,也可以是任何Linux下的可执行的脚本文件,与一般情况不
同,exec函数族的函数执行成功后不会返回,只有调用失败了才会返回一个-1,从原程序的调用点接着往下执行。它也是不能控制程序窗口是否显示。
3)使用WinExec函数
WinExec函数可以方便地在应用程序中执行一个程序,执行一个标准程序一般使用:
WinExec('C:\WINDOWS\NOTEPAD.EXE',
SW_SHOWNORMAL);
第二个参数是控制程序主窗口的显示方式,用WinExec只能执行exe文件,但是WinExec函数不好控制主程序来等该exe程序的结束。WinExec是Windows的老函数了,现在的CreateProcess几乎可以替代WinExe的所有功能。
4)使用CreateProcess函数
CreateProcess函数是新建一个进程,下面是一个使用CreateProcess函数的例子:
void createchildprocessandwaituntildone(const
ansistring& strcmdline)
{
process_information piprocinfo;
startupinfo sistartinfo;
// set up members of startupinfo structure.
sistartinfo.cb = sizeof(startupinfo);
sistartinfo.lpreserved = null;
sistartinfo.lpreserved2 = null;
sistartinfo.cbreserved2 = 0;
sistartinfo.lpdesktop = null;
sistartinfo.dwflags = 0;
// create the child process.
createprocess(
null,
strcmdline.c_str(),
null, // process security attributes
null, // primary thread security attributes
0, // handles are inherited
0, // creation flags
null, // use parent\'s environment
null, // use parent\'s current directory
&sistartinfo, // startupinfo pointer
&piprocinfo); // receives process_information
// wait for the processs to finish
dword rc = waitforsingleobject(
piprocinfo.hprocess, // process handle
infinite);
}
使用CreateProcess函数,你必须人为地控制该进程的生死,这一方面是使用进程控制来实现。进程控制的意义在于可以创建一个进程,并且可以通过进程句柄结束进程。
5)使用ShellExcecuteEx函数
这个函数主要是在文件上执行一个函数,如果执行成功则返回一个非0值,否则返回一个0值。函数的原型是:
WINSHELLAPI BOOL WINAPI
ShellExecuteEx(
LPSHELLEXECUTEINFO lpExecInfo);
参数lpExecInfo:是数据结构 LPSHELLEXECUTEINFO
的地址,包含了和接收一些被执行的应用程序的一些信息。下面是一个使用的示例:
SHELLEXECUTEINFO
ShExecInfo =
{0};
ShExecInfo.cbSize
=
sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask
=
SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd
= NULL;
ShExecInfo.lpVerb
= _T("open");
ShExecInfo.lpFile
=
_T("a.exe");
ShExecInfo.lpParameters
= _T("-a
a");
ShExecInfo.lpDirectory
= NULL;
ShExecInfo.nShow
= SW_HIDE;
ShExecInfo.hInstApp
=
NULL;
ShellExecuteEx(&ShExecInfo);
WaitCursorBegin();
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
WaitCursorEnd();
这个函数可以通过ShExecInfo.lpParameters来传递exe文件的参数,通过属性ShExecInfo.nShow来控制程序窗口是否显示。
后面三个函数都是SDK函数,现在在执行项目中的exe文件的时候,使用比较多的就是后面得两个函数,我在自己的项目中使用的就是ShellExecuteEx函数,比CreateProcess函数使用方便一些。
a.使用system函数
b.使用exec或者是execv函数
c.使用WinExec函数
d.使用CreateProcess函数
e.使用ShellExcecuteEx函数
1)
上面的5中方法中,system函数,函数原型system(执行shell命令)定义函数是,int system(const char * string),可以调用一些DOS命令,比如:
system("cls");//清屏,等于在DOS上使用cls命令
system函数会调用fork()函数产生子进行横,由子进程来调用/bin/sh-c
string来执行参数string字符串所代表的命令,此命令执行完后随即返回调用的进程,system函数不能控制程序窗口是否显示。一般在项目中,这种方法不予考虑。
2)使用execl或execv函数
这是exec函数族里面的两个函数,在UNIX环境下用的比较多,exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,
也就是说在调用进程内部执行一个可执行文件,这里的可执行文件既可以是二进制文件,也可以是任何Linux下的可执行的脚本文件,与一般情况不
同,exec函数族的函数执行成功后不会返回,只有调用失败了才会返回一个-1,从原程序的调用点接着往下执行。它也是不能控制程序窗口是否显示。
3)使用WinExec函数
WinExec函数可以方便地在应用程序中执行一个程序,执行一个标准程序一般使用:
WinExec('C:\WINDOWS\NOTEPAD.EXE',
SW_SHOWNORMAL);
第二个参数是控制程序主窗口的显示方式,用WinExec只能执行exe文件,但是WinExec函数不好控制主程序来等该exe程序的结束。WinExec是Windows的老函数了,现在的CreateProcess几乎可以替代WinExe的所有功能。
4)使用CreateProcess函数
CreateProcess函数是新建一个进程,下面是一个使用CreateProcess函数的例子:
void createchildprocessandwaituntildone(const
ansistring& strcmdline)
{
process_information piprocinfo;
startupinfo sistartinfo;
// set up members of startupinfo structure.
sistartinfo.cb = sizeof(startupinfo);
sistartinfo.lpreserved = null;
sistartinfo.lpreserved2 = null;
sistartinfo.cbreserved2 = 0;
sistartinfo.lpdesktop = null;
sistartinfo.dwflags = 0;
// create the child process.
createprocess(
null,
strcmdline.c_str(),
null, // process security attributes
null, // primary thread security attributes
0, // handles are inherited
0, // creation flags
null, // use parent\'s environment
null, // use parent\'s current directory
&sistartinfo, // startupinfo pointer
&piprocinfo); // receives process_information
// wait for the processs to finish
dword rc = waitforsingleobject(
piprocinfo.hprocess, // process handle
infinite);
}
使用CreateProcess函数,你必须人为地控制该进程的生死,这一方面是使用进程控制来实现。进程控制的意义在于可以创建一个进程,并且可以通过进程句柄结束进程。
5)使用ShellExcecuteEx函数
这个函数主要是在文件上执行一个函数,如果执行成功则返回一个非0值,否则返回一个0值。函数的原型是:
WINSHELLAPI BOOL WINAPI
ShellExecuteEx(
LPSHELLEXECUTEINFO lpExecInfo);
参数lpExecInfo:是数据结构 LPSHELLEXECUTEINFO
的地址,包含了和接收一些被执行的应用程序的一些信息。下面是一个使用的示例:
SHELLEXECUTEINFO
ShExecInfo =
{0};
ShExecInfo.cbSize
=
sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask
=
SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd
= NULL;
ShExecInfo.lpVerb
= _T("open");
ShExecInfo.lpFile
=
_T("a.exe");
ShExecInfo.lpParameters
= _T("-a
a");
ShExecInfo.lpDirectory
= NULL;
ShExecInfo.nShow
= SW_HIDE;
ShExecInfo.hInstApp
=
NULL;
ShellExecuteEx(&ShExecInfo);
WaitCursorBegin();
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
WaitCursorEnd();
这个函数可以通过ShExecInfo.lpParameters来传递exe文件的参数,通过属性ShExecInfo.nShow来控制程序窗口是否显示。
后面三个函数都是SDK函数,现在在执行项目中的exe文件的时候,使用比较多的就是后面得两个函数,我在自己的项目中使用的就是ShellExecuteEx函数,比CreateProcess函数使用方便一些。
展开全部
这样:
system("set.exe");
如果不在同一路径,还需要加路径
system("set.exe");
如果不在同一路径,还需要加路径
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Winexec(“set.exe”,SW_Show);
更多追问追答
追问
WinExec达不到system的效果,我需要等待set.exe运行完后才执行下面的语句。
我知道,在bat中,写成 "set" (加引号)可以达到我需要的效果,可是system("\"set\"")却不行。。
追答
你的写法错了,这个样写 system("C:\\set.exe");
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我就不测了 你自己去试试吧 system("..\\set.exe");
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询