丑子喵 發表於 2023-5-16 23:17:00

Delphi-Delphi通过管道执行外部命令行程序(cmd)并获取返回结果

<p>&nbsp;</p>
<p><strong>相关资料:</strong></p>
<p>https://www.shuzhiduo.com/A/gGdXxNGmd4/&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Delphi通过管道执行外部命令行程序(cmd)并获取返回结果</p>
<p><strong>实例代码:</strong></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_d56df01e-1bfd-46f0-8979-cfefb29befba" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_d56df01e-1bfd-46f0-8979-cfefb29befba" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_d56df01e-1bfd-46f0-8979-cfefb29befba" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> Unit1;

</span><span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TForm1 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TForm)
    Button1: TButton;
    Memo1: TMemo;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">private</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Private declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Public declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Form1: TForm1;

</span><span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$R *.dfm</span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">function</span> RunDosCommand(Command: <span style="color: rgba(0, 0, 255, 1)">string</span>): <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
hReadPipe: THandle;
hWritePipe: THandle;
SI: TStartUpInfo;
PI: TProcessInformation;
SA: TSecurityAttributes;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   SD   :   TSecurityDescriptor;</span>
<span style="color: rgba(0, 0, 0, 1)">BytesRead: DWORD;
Dest: AnsiString;
TmpList: TStringList;
Avail, ExitCode, wrResult: DWORD;
osVer: TOSVERSIONINFO;
tmpstr: AnsiString;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(Dest, </span><span style="color: rgba(128, 0, 128, 1)">1024</span><span style="color: rgba(0, 0, 0, 1)">);
osVer.dwOSVersionInfoSize :</span>=<span style="color: rgba(0, 0, 0, 1)"> Sizeof(TOSVERSIONINFO);
GetVersionEX(osVer);

</span><span style="color: rgba(0, 0, 255, 1)">if</span> osVer.dwPlatformId = VER_PLATFORM_WIN32_NT <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">         InitializeSecurityDescriptor(@SD,   SECURITY_DESCRIPTOR_REVISION);</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">         SetSecurityDescriptorDacl(@SD,   True,   nil,   False);</span>
    SA.nLength :=<span style="color: rgba(0, 0, 0, 1)"> SizeOf(SA);
    SA.lpSecurityDescriptor :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">@SD;</span>
    SA.bInheritHandle :=<span style="color: rgba(0, 0, 0, 1)"> True;
    CreatePipe(hReadPipe, hWritePipe, @SA, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
    CreatePipe(hReadPipe, hWritePipe, </span><span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(128, 0, 128, 1)">1024</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    FillChar(SI, SizeOf(SI), </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
    SI.cb :</span>=<span style="color: rgba(0, 0, 0, 1)"> SizeOf(TStartUpInfo);
    SI.wShowWindow :</span>=<span style="color: rgba(0, 0, 0, 1)"> SW_HIDE;
    SI.dwFlags :</span>=<span style="color: rgba(0, 0, 0, 1)"> STARTF_USESHOWWINDOW;
    SI.dwFlags :</span>= SI.dwFlags <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> STARTF_USESTDHANDLES;
    SI.hStdOutput :</span>=<span style="color: rgba(0, 0, 0, 1)"> hWritePipe;
    SI.hStdError :</span>=<span style="color: rgba(0, 0, 0, 1)"> hWritePipe;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> CreateProcess(<span style="color: rgba(0, 0, 255, 1)">nil</span>, PChar(@Command[<span style="color: rgba(128, 0, 128, 1)">1</span>]), <span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>, True, NORMAL_PRIORITY_CLASS, <span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>, SI, PI) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      ExitCode :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> ExitCode = <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      wrResult :</span>= WaitForSingleObject(PI.hProcess, <span style="color: rgba(128, 0, 128, 1)">500</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">               if   PeekNamedPipe(hReadPipe,   nil,   0,   nil,   @Avail,   nil)   then</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> PeekNamedPipe(hReadPipe, @Dest[<span style="color: rgba(128, 0, 128, 1)">1</span>], <span style="color: rgba(128, 0, 128, 1)">1024</span>, @Avail, <span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 0, 255, 1)">nil</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
          <span style="color: rgba(0, 0, 255, 1)">if</span> Avail &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
          <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            TmpList :</span>= TStringList.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            FillChar(Dest[</span><span style="color: rgba(128, 0, 128, 1)">1</span>], Length(Dest) * SizeOf(Char), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
            ReadFile(hReadPipe, Dest[</span><span style="color: rgba(128, 0, 128, 1)">1</span>], Avail, BytesRead, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
            TmpStr :</span>= Copy(Dest, <span style="color: rgba(128, 0, 128, 1)">0</span>, BytesRead - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
            TmpList.Text :</span>=<span style="color: rgba(0, 0, 0, 1)"> TmpStr;
            Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> tmpstr;
            </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
            TmpList.Free;
            </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
          </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> wrResult &lt;&gt; WAIT_TIMEOUT <span style="color: rgba(0, 0, 255, 1)">then</span> ExitCode := <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      GetExitCodeProcess(PI.hProcess, ExitCode);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
memo1.Text :</span>= RunDosCommand(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">lanzhou_2023.EXE 22058878,2,88,32460,,13040503,94,1,K22.301|K11.901|E11.900|I10.x05,96.0800x005</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">memo1.Text := RunDosCommand('PING WWW.BAIDU.COM');</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>&nbsp;PS:</strong></span></p>
<p>生成的EXE需要放在被调用者的同目录下。因为有工作空间路径的问题。</p>
<p>&nbsp;</p>
<p><strong>实例代码:</strong></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_04d527df-512c-4c19-8959-b8241b7da251" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_04d527df-512c-4c19-8959-b8241b7da251" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_04d527df-512c-4c19-8959-b8241b7da251" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> Unit1;

</span><span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TForm1 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Button1Click(Sender: TObject);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Button2Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">private</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Private declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Public declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> procedure group_txt(); stdcall; external 'lanzhou_2023.dll';</span>

<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Form1: TForm1;

</span><span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$R *.dfm</span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> memo1.Text = group_record('"22082078,1,24, 9105, 3470,13050201, 6, 1,\"K63.500,K52.910\",\"00.5500,45.4300x010,45.4300x013\""');</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> memo1.Text := group_record('22082078,1,24, 9105, 3470,13050201, 6, 1,"K63.500,K52.910","00.5500,45.4300x010,45.4300x013"');</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> group_txt();</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span> GetRunConsoleResult(FileName:String;Visibility:Integer;<span style="color: rgba(0, 0, 255, 1)">var</span> mOutputs:<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">):Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
sa:TSecurityAttributes;
hReadPipe,hWritePipe:THandle;
ret:BOOL;
strBuff:</span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">255</span>] <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> char;
lngBytesread:DWORD;

WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FillChar(sa,Sizeof(sa),#</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
sa.nLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Sizeof(sa);
sa.bInheritHandle :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
sa.lpSecurityDescriptor :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span>(CreatePipe(hReadPipe, hWritePipe, @sa, <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result:</span>=-<span style="color: rgba(128, 0, 128, 1)">2</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通道创建失败</span>
    <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
WorkDir:</span>=<span style="color: rgba(0, 0, 0, 1)">ExtractFileDir(Application.ExeName);
FillChar(StartupInfo,Sizeof(StartupInfo),#</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
StartupInfo.cb:</span>=<span style="color: rgba(0, 0, 0, 1)">Sizeof(StartupInfo);
StartupInfo.dwFlags:</span>=STARTF_USESHOWWINDOW <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> STARTF_USESTDHANDLES;
StartupInfo.wShowWindow:</span>=<span style="color: rgba(0, 0, 0, 1)">Visibility;

StartupInfo.hStdOutput:</span>=<span style="color: rgba(0, 0, 0, 1)">hWritePipe;
StartupInfo.hStdError:</span>=<span style="color: rgba(0, 0, 0, 1)">hWritePipe;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> CreateProcess(<span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">,
    PChar(FileName),               </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to command line string </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    @sa,                           </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to process security attributes </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    @sa,                           </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to thread security attributes </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    True,                        </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> handle inheritance flag </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    NORMAL_PRIORITY_CLASS,
    </span><span style="color: rgba(0, 0, 255, 1)">nil</span>,                           <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to new environment block </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    PChar(WorkDir),                </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to current directory name, PChar</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    StartupInfo,                   </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to STARTUPINFO </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    ProcessInfo)                   </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> pointer to PROCESS_INF </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= INFINITE <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">-1 进程创建失败</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      CloseHandle(hWritePipe);
      mOutputs:</span>=<span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> ret <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FillChar(strBuff,Sizeof(strBuff),#</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
      ret :</span>= ReadFile(hReadPipe, strBuff, <span style="color: rgba(128, 0, 128, 1)">256</span>, lngBytesread, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
      mOutputs :</span>= mOutputs +<span style="color: rgba(0, 0, 0, 1)"> strBuff;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

      Application.ProcessMessages;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等待console结束</span>
<span style="color: rgba(0, 0, 0, 1)">      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess,Cardinal(Result));
      CloseHandle(ProcessInfo.hProcess);</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> to prevent memory leaks </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(hReadPipe);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.Button2Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
e, p, s: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
e:</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\java\DRG_Csharp\drg_group\lanzhou_2023\delphi\lanzhou_2023.exe</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
p:</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">22082078,1,24, 9105, 3470,13050201, 6, 1,"K63.500,K52.910","00.5500,45.4300x010,45.4300x013"</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> GetRunConsoleResult(执行文件,SW_SHOWNORMAL,返回字符串); //函数执行成功返回 0</span>
GetRunConsoleResult(e,SW_SHOWNORMAL,s); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">函数执行成功返回 0</span>
memo1.Text:=<span style="color: rgba(0, 0, 0, 1)"> s;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div id="qb-sougou-search" style="display: none; opacity: 0">
<p>翻译</p>
<p class="last-btn">搜索</p>
<p class="last-btn">复制</p>
<iframe width="320" height="240"></iframe></div>

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">   
      <div>作者:疯狂Delphi</div>
      <div>出处:https://www.cnblogs.com/FKdelphi/</div>
      <div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.</div>
</div>
<div class="div_masklayer" id="div_masklayer"></div>
<div class="div_popup" id="Div_popup">
<p class="mid">欢迎关注我,一起进步!扫描下方二维码即可加我</p>
<img class="img_zfb" id="img_zfb" width="150" src="https://images.cnblogs.com/cnblogs_com/FKdelphi/1101510/o_251208113944_QQ.png">
<img class="img_zfb" id="img_zfb" width="150" src="https://images.cnblogs.com/cnblogs_com/FKdelphi/1101510/o_251208115029_WX.png">
</div><br><br>
来源:https://www.cnblogs.com/FKdelphi/p/17407200.html
頁: [1]
查看完整版本: Delphi-Delphi通过管道执行外部命令行程序(cmd)并获取返回结果