请问如何在程序中调用外部的可执行程序
解决方案 »
- ring3 hook ntdll!NtCreateSection,为什么获取的ObjectAttributes经常无效
- 有关一个基于对话框的类似表格数据录入及显示的小程序的若干问题
- 如何实现程序中两个WebBrowser的同步
- ADO 线程安全吗
- 看来是升星无望了,五天才搞了249分,看来我是坚持不下去了!兴趣越来越小!CSDN的人气也是一天不如一天啊,大家还是少泡WEB了吧,干正事
- 帮忙解释一下,这两句话是什么意识
- DirectShow 播放DVD ?没有MPEG2的解码器?
- 关于TreeCtrl的checkbox的一个极其简单的问题(在线等候您的救援,只要解决立即赠分)
- mfc中menu的添加问题
- VC对话框类与以话框类相互访问
- 请问如何在程序中调用外部的可执行程序
- 关于函数与指针的问题,请大家帮忙
ShellExecute
CreateProcess
WinExec
ShellExecute
CreateProcess
最简单的WinExec
WinExec("notepad.exe,SW_SHOW");
方法二:
ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOWMAXIMIZED)
方法三:
STARTUPINFO si;
::ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;if(::CreateProcess(NULL,_T("notepad.exe"),NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
{
::CloseHandle(pi.hThread);
::WaitForSingleObject(pi.hProcess);
}
安全性评价
第一个参数 lpApplicationName 可以为 NULL。在这种情况下,可执行程序的名称必须是 lpCommandLine 中第一个用空格分隔的字符串。但是,如果可执行程序的名称或路径名中有空格,则存在一定的风险,因为如果空格处理不当,就可能会运行恶意的可执行程序。以下示例是危险的,因为该进程将试图运行“Program.exe”(如果该程序存在),而不是“foo.exe”。CreateProcess(NULL, "C:\Program Files\foo", ...) 如果恶意用户要在系统中创建名为“Program.exe”的特洛伊程序,那么任何使用“Program Files”目录不正确地调用 CreateProcess 的程序都将启动特洛伊程序,而不是要调用的应用程序。注意不要为 lpApplicationName 传递 NULL,以避免函数根据其运行时参数来分析并确定可执行文件路径名。否则,如果 lpApplicationName 为 NULL,则用引号将 lpCommandLine 中的可执行路径引起,如下例所示。CreateProcess(NULL, "\"C:\Program Files\foo.exe\" -L -S", ...) WinExec
安全性评价
可执行名称被视为 lpCmdLine 中的第一个用空格分隔的字符串。 但是,如果可执行程序的名称或路径名中有空格,则存在一定的风险,因为如果空格处理不当,就可能会运行恶意的可执行程序。以下示例是危险的,因为该进程将试图运行“Program.exe”(如果该程序存在),而不是“foo.exe”。WinExec("C:\Program Files\foo", ...)
如果恶意用户要在系统中创建名为“Program.exe”的特洛伊程序,那么任何使用“Program Files”目录不正确地调用 WinExec 的程序都将启动特洛伊程序,而不是要调用的应用程序。就安全性而言,我们强烈建议您使用 CreateProcess 而不是 WinExec。但是,如果您由于遗留问题而必须使用 WinExec,则务必要将应用程序名用引号引起来,如下例所示:WinExec("\"C:\Program Files\foo.exe\" -L -S", ...)
WinExec
ShellExecute
CreateProcess