CreateProcess(createprocess error 5)

http://www.itjxue.com  2023-02-12 07:33  来源:未知  点击次数: 

VC编程中,想使用createprocess调用excel.exe来启动多个xls,该如何设置参数呢?

office系列都自带了防多开功能,其中word和excel用了很低级的dde,而ppt用了比较高端的事件对象,用createprocess可以直接绕过dde,但是无法直接绕过ppt这种机制,因此createprocess打开多个excel文件就会产生多个exe,但ppt只会有1个。

从注册表中找到xls文件的打开参数"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /e

也就是说explore根本没有理想中的那样通过CreateProcess传文件名给excel.exe,另外还可以找到ddeexec键,说明是做了dde的,点进去可以发现open("%1"),也就是说explore只是启动了excel.exe,然后相当于给excel.exe发送消息,让他执行“打开文件”操作,这点可以用api monitor监视到,另外用api monitor监控结果表明,双击xls文件后执行CreateProcess,第一个参数是C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE,第二个参数是"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /e,这时再双击一个xls文件发现压根就没执行CreateProcess了,说明explore内部做了一次检测,当打开一个xls文件的时候检测是否已经打开了excel.exe,如果已经打开了,就不需要CreateProcess了,而是直接告诉excel.exe让他执行“打开文件”操作

所以如果自己编程就要做到跟explore一样的事情,首先CreateProcess是已知的,但是用什么函数让excel.exe去执行“打开”操作我就不知道了,之前做过破解office的这种机制实现多开,却没有反过来考虑过,只能帮你这么多了

ShellExecute,CreateProcess三个函数的区别和联系

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。

WinExec 两个参数,前一个指定路径,后一个指定显示方式。

ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。

CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。

使用WinExec命令

⑴ 函数原型: 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获得的所有选项,而它的确简单。

使用ShellExecute命令

⑴ 函数原型: HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);

⑵ 参数:

hwnd:指向父窗口的窗口句柄。此窗口接收应用程序产生的任何信息框。

lpOperation:一个空结束的字符串地址,此字符串指定要执行的操作。下面的操作字符串是有效的:

"open" 此函数打开由参数lpFile指定的文件,此文件可以是一个可执行文件或文档文件,也可是一个文件夹。

"print" 此函数打印由参数lpFile指定的文件,此文件应是一个文档文件,假如此文件是一个可执行文件,则打开此文件。

"explore" 此函数搜索由参数lpFile指定的文件夹,此文件应是一个文档文件, 此参数可以为空。这种情况下,函数用于打开由参数lpFile指定的文件。

lpFile:一个空结束的字符串地址,此字符串指定要打开或打印的文件或者是要打开或搜索的文件夹。

lpParameters:假如参数lpFile指定一个可执行文件,lpParameters则是一个空结束的字符串地址,此字符串指定要传递给应用程序的参数。假如lpFile指定一个文档文件,lpParameters应为空。

lpDirectory:一个空结束的字符串地址,此字符串指定默认目录。

nShowCmd:假如lpFile指定一个可执行文件,nShowCmd表明应用程序打开时如

何显示。假如lpFile指定一个文档文件,nShowCmd应为空。

⑶ 返回值: 若函数调用成功,则返回值大于32,否则为一个小于等于32的错误值。

说明:可以用此函数打开或搜索一个外壳文件夹。打开文件夹可用下面任何一种形式:

ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);

ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);

搜索文件夹,可用如下形式

ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL);

ShellExecute命令虽已过时但易于得到。该命令向命令解释程序提出打开、浏览或打印文档或文件夹的请求,虽然可以用 ShellExecute运行程序,但通常只发送文档名,而命令解释程序则决定要运行那个程序。另外在打开目录文件夹时,ShellExecute命令非 常有用。

⑷ 程序示例

下面通过一个例子来说名WinExec和ShellExecute的使用。下面程序有控制台程序示例,其使用两种不同的方法,打开文本文件。下面程序使用WinExec,并明确指定使用记事本程序。然后,使用ShellExecute,打开文本文件。

程序清单

#include windows.h

#include iostream.h

void main(int argc,char *argv[])

{

cout ”Opening with WinExec\n”;

if (WinExec(“notepad readme.txt”,SH_SHOW) 32)

MessagBox(NULL,”Can’t WinExec”,NULL,MB_OK);

cout ”Press Enter\n”;

MessagBox(NULL,”Press OK to continue”,”Progrm Launched”,MB_OK);

cout ”Opening with ShellExecute\n”;

if (ShellExecute (NULL,”open”,”readme.txt”,NULL,NULL,SW_SHOW)

(HANDLE) 32)

MessagBox(NULL,”Can’t ShellExecute\n”,NULL,MB_OK);

}

使用CreateProcess命令

⑴ 函数原型:

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

);

⑵ 参数:

lpApplicationName:指向一个以空结尾的串,他指定了要执行的模块

lpCommandLine:指向一个以空结尾的串,该串定义了要执行的命令行。

lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。

lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。

bInheritHandles,:表明新进程是否从调用进程继承句柄。

dwCreationFlags:定义控制优先类和进程创建的附加标志。

lpEnvironment:指向一个新进程的环境块。

lpCurrentDirectory:指向一个以空结尾的串,该串定义了子进程的当前驱动器和当前目录。

lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程的主窗口将如何显示。

lpProcessInformation:指向PROCESS_INFORMATION结构,该结构接受关于新进程的表示信息。

⑶ 返回值:

若函数调用成功,则返回值不为0;若函数调用失败,返回值为0。

ShellExecute和WinExec命令用于简单的作业。如果要完全控制一个新进程,

就必须调用CreateProcess。

在上述参数中,参数lpStartupInfo是STARTUPINFO结构。可以用来设置控台的

标题,新窗口的的初始大小和位置,及重定向标准输入 和输出。新程序通常可以

忽略多数这些数据项,如果选择那样做的话。可以规定该结构体中的标志,已表明

要设置的数据段。有时,不想设置任何信息,也必须传递 一个有效的指针给空结

构(确定设置大小到cb,及设置dwFlags成员为0)。参数lpProcessInformation返

回进程和线程句柄,还包 括进程和线程ID。这些句柄拥有在参数

lpProcessAttributes和lpThreadAttributes中规定的访问。

要注意,针对CreateProcess的一些参数对控制台应用程序是特定的,而其它

参数则对各种应用程序有用。大多数情况下,并不一定要填入 STARTUPINFO结构,

但无论如何必须提供它。其返回值是布尔型的,而真正感兴趣的返回值发生于作为

参数传送的结构中 (PROCESS_INFORMATION)。CreateProcess返回该结构中的进

程ID及其句柄,以及初始线程ID及其句柄。可以将ID发送到 其它进程,或使用句

柄来控制新进程。

createprocess 用法

int i=1;

i=CreateProcess(NULL,"E:\\liucheng.exe", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, si, pi);

返回这样的值你也真牛啊。

,"E:\\liucheng.exe",

这个文件存在吗?

操作系统的实验吗?

在一个控制台程序中CreateProcess启动另一个控制台程序,新启动的程序输出在原程序的控制台窗口中

#include "stdio.h"

void main()

{

int a[9]={1,3,5,7,9,10,12,14};

int b,i,j;

scanf("%d",b);

for(i=0;i8;i++){

if(a[i]=b){ /*找到插入位置*/

for(j=8;ji;j--) /*后面元素均后移一位*/

a[j] = a[j-1];

a[i] = b; /*插入*/

break;

}

}

if(i==8) /*若该数大于所有数*/

a[8] = b;

for(i=0;i9;i++)

printf("%d ", a[i]);

printf("\n");

}

(责任编辑:IT教学网)

更多