我要启动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);

解决方案 »

  1.   

    CreateProcessResult := CreateProcess(nil,'f:\\Cpuid.exe',nil,nil,true,0,nil,nil,StartupInfo,ProcessInfo);DELPHI中的写法与C不一样的:CreateProcessResult := CreateProcess(nil,'f:\Cpuid.exe',nil,nil,true,0,nil,nil,StartupInfo,ProcessInfo);你多了一个任杠
      

  2.   

    在后台运行DOS程序,退出后不在系统任务栏中出现winoldap进程的实现下面是我在大富翁上拉下来的一个例子,测试非常成功 - 真是不留一点痕迹!1.功能函数function WinExecAndWait32(FileName:String; Visibility : integer): DWORD;
    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;