⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (2).txt

📁 Philips ARM lpc2000家族ISP下载源码集成了串口调试助手源码是个非常优秀的软件
💻 TXT
字号:
请问我想用CreateProcess完成下列任务,并用管道将其输出内容放在Memo中:
c:\\php\\php.exe -f "c:\\abc abc\\info.php"

请问该如何使用参数呢?

 
 回复人: xiaoxiaohan(萧晓寒) ( ) 信誉:100  2001-12-16 16:50:42Z  得分:10  
 
 
? 
如何正确使用CreateProcess函数?
(1)	LPCTSTR lpApplicationName
想运行的可执行文件的名字的字符串(应含扩展名)。如果找不到该文件,CreateProcess运行失败。应该设为NULL。
(2)	LPTSTR lpCommandLine
传递给新进程的命令行字符串,应当为非常量字符串的地址。可以设定一个完整的命令行,如果第一个标记没有扩展名,CreateProcess将其假设为.exe。如果找不到该文件,CreateProcess按环境设置目录搜索运行。
(3)	LPSECURITY_ATTRIBUTES 
设定进程对象的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。 (不明白)
(4)	LPSECURITY_ATTRIBUTES lpThreadAttributes
设定线程对象的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。 (不明白)
(5)	BOOL bInheritHandles
决定子进程对父进程继承性,一般设为FALSE。
(6)	DWORD dwCreationFlags
用于标识标志,以便用于规定如何来创建新进程。
标志	说明
EBUG_PROCESS	父进程想要调试子进程和子进程将来生成的任何进程。当任何子进程(被调试进程)中发生某些事件时,将情况通知父进程。 (不明白)
DEBUG_ONLY_THIS_PROCESS	与DEBUG_PROCESS标志相类似,调试程序只被告知紧靠父进程的子进程中发生的特定事件。 (不明白)
CREATE_SUSPENDED	新进程被创建,但是,它的主线程则被挂起。
DETACHED_PROCESS	阻止基于CUI的进程对它的父进程的控制台窗口的访问,并告诉系统将它的输出发送到新的控制台窗口。
CREATE_NEW_CONSOLE	为新进程创建一个新控制台窗口。如果同时设定CREATE_NEW_CONSOLE和DETACHED_PROCESS标志,就会产生一个错误。
CREATE_NO_WINDOW	不为应用程序创建任何控制台窗口。
CREATE_NEW_PROCESS_GROUP	修改用户在按下Ctrl+C或Ctrl+Break键时得到通知的进程列表。
CREATE_DEFAULT_ERROR_MODE	不继承父进程使用的错误模式。
CREATE_SEPARATE_WOW_VDM	只能当你在Windows2000上运行16位Windows应用程序时使用。告诉系统创建一个单独的DOS虚拟机(VDM),并且在该VDM中运行16位Windows应用程序。 (不明白)
CREATE_SHARED_WOW_VDM	只能当你在Windows2000上运行16位Windows应用程序时使用。在系统的共享VDM中运行16位Windows应用程序。 (不明白)
CREATE_UNICODE_ENVIRONMENT	告诉系统,子进程的环境块应该包含Unicode字符。按照默认设置,进程的环境块包含的是ANSI字符串。
CREATE_FORCEDOS	强制系统运行嵌入16位OS/2应用程序的MOS-DOS应用程序。
CREATE_BREAKAWAY_FROM_JOB	使作业中的进程生成一个与作业相关联的新进程 (不明白)。
IDLE_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSNORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSREALTIME_PRIORITY_CLASS	空闲低于正常(Windows2000)正常高于正常(Windows2000)高实时
对于大多数应用程序来说不应该设定优先级类。
(7)	LPVOID lpEnvironment
指向包含新进程将要使用的环境字符串的内存块。在大多数情况下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。也可以使用GetEnvironmentStrings函数当不再需要该内存块时,应该调用FreeEnvironmentStrings函数将内存块释放。
(8)	LPCTSTR lpCurrentDirectory
设置子进程的当前驱动器和目录。如果本参数是NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么必须指向包含需要的工作驱动器和工作目录的以0 结尾的字符串。注意,必须设定路径中的驱动器名。
(9)	LPSTARTUPINFO lpStartupInfo
使用时应首先进行初始化。
成员	窗口/控制台	作用
cb	两者兼有	用作版本控制手段。必须初始化为sizeof(STARTUPINFO)
lpReserved	两者兼有	保留。必须初始化为NULL (不为NULL也可以)
lpDesktop	两者兼有	标识启动应用程序所在桌面的名字。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。其值为NULL时,与当前桌面相关联。 (不明白)
lpTitle	控制台	设定控制台窗口的名称。其值为NULL,则把可执行文件的名字用作窗口名。
dwXdwY	两者兼有	设定应用程序窗口在屏幕上的位置(以像素为单位)。只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。
dwXSizedwYsize	两者兼有	设定应用程序窗口的宽度和长度(以像素为单位)只有当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。
dwXCountCharsdwYCountChars	控制台	设定子应用程序的控制台窗口的宽度和高度(以字符为单位)
dwFillAttribute	控制台	设定控制台窗口的文本和背景颜色
dwFlags	两者兼有	后面以表格说明。
wShowWindow	窗口	设定如果子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。
cbReserved2	两者兼有	保留。必须被初始化为0 (非0也可以)
lpReserved2	两者兼有	保留。必须被初始化为NULL (为什么)
hStdInputhStdOutputhStdError	控制台	设定控制台输入输出缓存的句柄。照默hStdInput标识键盘缓存,hStdOutput和hStdError标识控制台窗口缓存。
dwFlags使用方法:
标志	含义
STARTF_USESIZE	使用dwXSize和dwYSize成员
STARTF_USESHOWWINDOW	使用wShowWindow成员
STARTF_USEPOSITION	使用dwX和dwY成员
STARTF_USECOUNTCHARS	使用dwXCountChars和dwYCountChars成员
STARTF_USEFILLATTRIBUTE	使用dwFillAttribute成员
STARTF_USESTDHANDLES	使用hStdInput、hStdOutput和hStdError成员
STARTF_RUN_FULLSCREEN	强制在x86计算机上运行的控制台应用程序以全屏幕方式运行
STARTF_FORCEONFEEDBACK	启动进程时,临时将系统的箭头光标改为沙漏箭头光标。
STARTF_FORCEOFFFEEDBACK	启动进程时,不将光标改为沙漏。
(10)	LPPROCESS_INFORMATION lpProcessInformation
新进程的返回信息。hProcess为新进程内核对象的句柄;hThread为新线程内核对象的句柄。在使用后应当用CloseHandle释放,使该内核的使用计数减一。dwProcessId新进程ID号;dwThreadId新线程ID号。0不能为ID号。虽然系统不会同时有相同的ID号,但是当一个进程的内核句柄被释放后其ID号又可能被新的进程使用。若要确保进程ID或线程ID不被重复使用,唯一的方法是保证进程或线程的内核对象不会被撤消。如果刚刚创建了一个新进程或线程,只要不关闭这些对象的句柄,就能够保证进程对象不被撤消。一旦应用程序结束使用该ID,那么调用CloseHandle就可以释放内核对象,要记住,这时使用或依赖进程ID,对来说将不再安全。如果使用的是子进程,将无法保证父进程或父线程的有效性,除非父进程复制了它自己的进程对象或线程对象的句柄,并让子进程继承这些句柄。


 
Top 
 
 回复人: fjfeng(fjfeng) ( ) 信誉:100  2001-12-16 18:40:31Z  得分:0  
 
 
? 
bcb目录examples里的wintools有完整的使用说明。

 
Top 
 
 回复人: fjfeng(fjfeng) ( ) 信誉:100  2001-12-16 18:41:17Z  得分:0  
 
 
? 
是例子!

 
Top 
 
 回复人: shally5(我在一旁静静的看着你) ( ) 信誉:100  2001-12-16 21:33:16Z  得分:40  
 
 
? 

这是我从CSDN学的就转传给你啦!

用法:

PipeCall("c:\\xxx.exe");

void __fastcall TForm1::PipeCall(AnsiString FName)
{
        //TODO: Add your source code here
  if(FileExists(FName))
  {     
        char readBuf[5000];
        DWORD bytesRead=0;
        HANDLE hReadPipe,hWritePipe;
        PROCESS_INFORMATION pi;
        LPPROCESS_INFORMATION lppi;
        SECURITY_ATTRIBUTES lsa;        //安全属性
        STARTUPINFO myStartup;
        lsa.nLength = sizeof(SECURITY_ATTRIBUTES);
        lsa.lpSecurityDescriptor = NULL;
        lsa.bInheritHandle = true;

        lppi = π
        //创建管道
        if(CreatePipe(&hReadPipe,&hWritePipe,&lsa,0))
        {
           Sleep(2000);
        //                ShowMessage("Pipe Created OK .\n");
                }
        else
                {
//                ShowMessage("Pipe Creation Error");
                ShowMessage("进程管道建立失败");
                return;
        }

        memset(&myStartup,0,sizeof(STARTUPINFO));
        myStartup.cb = sizeof(STARTUPINFO);
        myStartup.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
        myStartup.wShowWindow = SW_HIDE;
        myStartup.hStdOutput = hWritePipe;

      if(!CreateProcess(NULL/*批文件或执行文件名*/,FName.c_str(),NULL,NULL,true,CREATE_NEW_CONSOLE,
                      NULL,NULL,&myStartup,&pi))
      {
           ShowMessage("CreateProcess error:"+IntToStr(GetLastError()));
           return;
      }
      while(true)
      {
        bytesRead = 0;
        if(!PeekNamedPipe(hReadPipe,readBuf,1,&bytesRead,NULL,NULL)) break;
        if(bytesRead)
        {
          if(!ReadFile(hReadPipe,readBuf,4096,&bytesRead,NULL)) break;
          readBuf[bytesRead] = 0;
            Memo1->Lines->Add(readBuf);
         }
         else
         {
           if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0) break;
           Sleep(1000);
        }
      }

      CloseHandle(hReadPipe);
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
      CloseHandle(hWritePipe);
   }
   else
   {
     ShowMessage("进程文件不存在");
   }
}

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -