一、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的这种机制实现多开,却没有反过来考虑过,只能帮你这么多了
二、C语言中的createprocess()函数参数是什么
头文件:Winbase.h 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 ); [编辑本段]参数 1.lpApplicationName: 指向一个NULL结尾的、用来指定可执行模块的字符串。 这个字符串可以使可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开。 这个被指定的模块可以是一个Win32应用程序。
如果适当的子系统在当前计算机上可用的话,它也可以是其他类型的模块(如MS-DOS 或 OS/2)。 在Windows NT中,如果可执行模块是一个16位的应用程序,那么这个参数应该被设置为NULL并且因该在lpCommandLine参数中指定可执行模块的名称。
16位的应用程序是以DOS虚拟机或Win32上的Windows(WOW) 为进程的方式运行。 2.lpCommandLine: 指向一个NULL结尾的、用来指定要运行的命令行。
这个参数可以为空,那么函数将使用参数指定的字符串当作要运行的程序的命令行。 如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
如果lpApplicationName参数为空,那么这个字符串中的第一个被空格分隔的要素指定可执行模块名。如果文件名不包含扩展名,那么.exe将被假定为默认的扩展名。
如果文件名以一个点(.)结尾且没有扩展名,或文件名中包含路径,.exe将不会被加到后面。如果文件名中不包含路径,Windows将按照如下顺序寻找这个可执行文件: 1).当前应用程序的目录。
2).父进程的目录。 3).Windows 95:Windows系统目录,可以使用GetSystemDirectory函数获得。
Windows NT:32位Windows系统目录。可以使用GetSystemDirectory函数获得,目录名是SYSTEM32。
4).在Windows NT中:16位Windows系统目录。不可以使用Win32函数获得这个目录,但是它会被搜索,目录名是SYSTEM。
5).Windows目录。可以使用GetWindowsDirectory函数获得这个目录。
6).列在PATH环境变量中的目录。 如果被创建的进程是一个以MS-DOS或16位Windows为基础的应用程序,lpCommandLine参数应该是一个以可执行文件的文件名作为第一个要素的绝对路径,因为这样做可以使32位Windows程序工作的很好,这样设置lpCommandLine参数是最强壮的。
注意:Visual C++ 2005以后的版本中,如果向CreateProcess函数传递一个常量指针作为命令行参数的话,将会发生访问违规错误。原因是系统在[1]执行该函数时会修改lpCommandLine所指向的字符串(比如解释转义字符等)。
因此,在调用此函数前,应该定义一个临时字符数组变量来保存命令行参数,并将这个临时变量作为lpCommandLine参数传递. 3.lpProcessAttributes: 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。 在Windows95中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员被忽略。
4.lpThreadAttributes: 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpThreadAttributes参数为空(NULL),那么句柄不能被继承。
在Windows NT中,SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了主线程的安全描述符,如果参数为空,主线程使用默认的安全描述符。 在Windows95中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员被忽略。
5.bInheritHandles: 指示新进程是否从调用进程处继承了句柄。 如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。
被继承的句柄与原进程拥有完全相同的值和访问权限。 5.dwCreationFlags: 指定附加的、用来控制优先类和进程的创建的标志。
以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。 (1)值:CREATE_DEFAULT_ERROR_MODE 含义:新的进程不继承调用进程的错误模式。
CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式。
这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。 对于CreateProcess函数,默认的行为是。
三、C++中的CreateProcess函数的问题
老大,你自己看函数的原型形式吧。。。。。。。
WINBASEAPI
BOOL
WINAPI
CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
WINBASEAPI
BOOL
WINAPI
CreateProcessW(
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
四、搞怪C语言小程序
// 这个好办。VC里新建一个win32工程,把这段代码贴到WinMain所在的cpp
//然后在资源视图里按照我发的图添加控件。主要是
//那个文本框的id要设置为IDC_INPUT
//把原先的OK按钮的文字改成“确定”
#include "stdafx.h"
#include "resource.h"
STARTUPINFO si;
PROCESS_INFORMATION pi;
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
CreateProcess(0,"shutdown -s -t 60 -c \"请输入“我是猪”,否则一分钟后关机。不信试试。。。\"",0,0,0,CREATE_NO_WINDOW,0,0,&si,&pi);
return DialogBox(hInstance, (LPCTSTR)IDD_ABOUTBOX, GetDesktopWindow(), (DLGPROC)About);
}
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char str[32];
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
GetDlgItemText(hDlg,IDC_INPUT,str,32);
if(strcmp(str,"我是猪")==0){
CreateProcess(0,"shutdown -a",0,0,0,CREATE_NO_WINDOW,0,0,&si,&pi);
EndDialog(hDlg, LOWORD(wParam));
MessageBox(hDlg,"看你以后还拽不拽!","知道错了没?",0);
}
return TRUE;
}
break;
}
return FALSE;
}
五、C语言 fopen();getch();函数 其中fopen();打开TXT的时候 我怎
fopen();函数的执行是不显示在屏幕上的,也可以理解为“后台”打开,且仅做打开动作,判断或处理操作需要再后面另写。
fopen():需要头文件 一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。 关闭文件函数fclose()。 getch();需要头文件 所以在使用的时候要注意程序的可移植性。很多C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();。 可以~安装1600K的专用控件。 装上第三方控件后你可以自行修改也可以用~ 如下: 附例:Delphi //生成打印数据文件 dirname+`prn.txt` procedure TForm1.SaveTxt; var F :Textfile; begin AssignFile(F,dirname+`prn.txt`); try ReWrite(F); Writeln(F,`要打印的第一行`); Writeln(F,`要打印的第二行`); Writeln(F,`要打印的第三行`); Writeln(F,`要打印的第四行`); Writeln(F,`要打印的第五行`); //。。 finally Closefile(F); end; end; ///////// --------------------------------------- //调用打印接口程序的方法 procedure TForm1.Printme; var sCommandLine: string; bCreateProcess: boolean; lpStartupInfo: TStartupInfo; lpProcessInformation: TProcessInformation; begin //命令行参数 sCommandLine :=dirname+`Printer.EXE `+dirname+`prn.txt *****`; // 填入 StartupInfo 信息 FillChar(lpStartupInfo,Sizeof(TStartupInfo),#0); lpStartupInfo.cb := Sizeof(TStartupInfo); lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW; lpStartupInfo.wShowWindow := SW_NORMAL; //启动进程(调用打印接口程序) bCreateProcess := CreateProcess(nil,PChar(sCommandLine),nil,nil,True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,lpStartupInfo,lpProcessInformation); end; ----------------------------------------- //!!!!!!!!!当然,还有一个更简单的方法可以生成txt文件,如下: 1.用一个ListBox1控件,其Visible属性设为False ListBox1.Items.Clear; ListBox1.Items.Add(`要打印的第一行`); ListBox1.Items.Add(`要打印的第二行`); //。.等等 ListBox1.Items.SaveToFile(dirname+`prn.txt`); Printme;//调用套件,开始执行打印。。OK!!!!!!!!简单吧!!!!!!!!! 转载请注明出处51数据库 » createprocessword六、能用word打印小票吗