我要启动f:盘下的Cpuid.exe文件,并获取ProcessInfo,使用CreateProcess()方法,
但返回值为false,是参数设置有问题吗?如果是,能否对各参数作一下解释。谢谢。
var
CreateProcessResult:bool;
StartupInfo:tstartupinfo;
ProcessInfo:tprocessinformation;
begin
CreateProcessResult := CreateProcess(nil,'f:\\Cpuid.exe',nil,nil,true,0,nil,nil,StartupInfo,ProcessInfo);
但返回值为false,是参数设置有问题吗?如果是,能否对各参数作一下解释。谢谢。
var
CreateProcessResult:bool;
StartupInfo:tstartupinfo;
ProcessInfo:tprocessinformation;
begin
CreateProcessResult := CreateProcess(nil,'f:\\Cpuid.exe',nil,nil,true,0,nil,nil,StartupInfo,ProcessInfo);
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(
nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo { pointer to PROCESS_INF }
)
then Result := $FFFFFFFF else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;2.使用例程
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExecAndWait32('COMMAND.COM /C COPY C:\AUTOEXEC.BAT D:\',SW_NORMAL);
showmessage('ok');
end;3.下载例程4. 补充说明 没翻译完在win32.hlp中输入StartupInfo,CreateProcess自己查看吧. 翻译的Win32API帮助, E文很臭,有误人子弟的地方请参考帮助.
TStartupInfo一些说明: StartupInfo结构被CreateProcess函数用来指定一个新建立的线程主
窗口的属性,对于GUI(Graphics User Interface)线程来说,这些信息
影响CreateWindow函数建立和ShowWindow函数显示的第一个窗口.而对
控制台程序,这些信息影响线程建立的新的控制台程序.当一个线程建
立后,能够利用GetStartupInfo函数获取一些StartupInfo的信息.typedef struct _STARTUPINFO { // si
DWORD cb; //指定该结构的大小(字节数)
LPTSTR lpReserved; //保留.在该结构通过CreateProcess之前,
//设置该成员为NULL.
LPTSTR lpDesktop; //仅仅Windows NT支持.
LPTSTR lpTitle; //对控制台程序来说,lpTitle在新建的控制台程序
//窗口标题栏中显示.如果lpTitle=NULL,可执行文
//件的名字显示在标题栏中.如果为GUI程序或不建立
//新窗口控制台程序,lpTitlel的值一定要设置为Null DWORD dwX; //当dwFlags为STARTF_USEPOSITION才起作用.控制窗口
//左上角相对屏幕的位置.单位是像素.对GUI程序来说,
//新程序调用CreateWindow(参数x=CW_USEDEFAULT)建
//立一个OverLap窗口时,首先使用指定的位置.
DWORD dwY; //见上.
DWORD dwXSize; //当dwFlags为STARTF_USESIZE才起作用.指定窗口的长宽
//单位是像素.对GUI程序来说,新程序调用CreateWindow
//(参数nWidth=CW_USEDEFAULT)建立一个OverLap窗口时,首先使
//用指定的长宽.
DWORD dwYSize; //见上.
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO; /////////////////////////////////////
TStartupInfo 这个结构中有一个 sShowWindow 栏位, 将之设为 SW_HIDE即可,
同时, dwFlags 标志中至少需含有 STARTF_USESHOWWINDOW, 否则CreateProcess
时, sShowWindow 栏位的设定会无效, 以下是修改过的程式:var
sCommandLine: string;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
begin
// sCommandLine 的内容请视您的情况修改
sCommandLine :='Xcopy d:\temp\temp1\*.* d:\temp\temp2 /v/y';
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_HIDE;
bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil,nil,True,
HIGH_PRIORITY_CLASS, nil, nil,lpStartupInfo, lpProcessInformation);
if bCreateProcess then
WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
end;