管道,简单使用

 2023-09-05 阅读 39 评论 0

摘要:1、 子进程(VC6代码): 1 #include <windows.h> 2 #include <stdio.h> 3 4 #include<iostream> 5 using namespace std; 6 7 int main() 8 { 9 //* 10 printf("_console_vc6(1) : %d\n", ::GetTickCount()); 11 fflush(stdout)

1、

子进程(VC6代码):

 1 #include <windows.h>
 2 #include <stdio.h>
 3 
 4 #include<iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9 //*
10     printf("_console_vc6(1) : %d\n", ::GetTickCount());
11     fflush(stdout); // 强制 printf 输出
12     Sleep(1000);
13     printf("_console_vc6(2) : %d\n", ::GetTickCount());
14     fflush(stdout); // 强制 printf 输出
15 //*/
16 /*
17     cout << "_console_vc6(3) : " << ::GetTickCount() << endl;
18     Sleep(1000);
19     cout << "_console_vc6(4) : " << ::GetTickCount() << endl;
20 //*/
21     return 0;
22 }

 

2、

父进程(Delphi代码):

 1 function TfrmMain.ExecDosCmd :boolean;
 2 var sa :SECURITY_ATTRIBUTES;
 3     si :STARTUPINFO;
 4     pi :PROCESS_INFORMATION;
 5     
 6     pcDosCmd :PChar;
 7     hRead,hWrite :THandle;
 8     cCommand :array[0..1023] of char;  //长达1k的命令行,够用了吧
 9     pcCommand1 :PChar;
10     cBuffer :array[0..4095] of char; //用4k的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
11     bytesRead :DWORD;
12     dwExitCode :DWORD;
13 
14     buf01 :array[0..4095] of char;
15     iLen01 :integer;
16 begin
17   Result := false;
18   //pcDosCmd := 'dir c:\';      //可以换成你的命令
19   //pcDosCmd := 'ping 192.168.2.1';      //可以换成你的命令
20   pcDosCmd := '_Console_Test_VC6.exe';
21 
22   sa.nLength := sizeof(SECURITY_ATTRIBUTES);
23   sa.lpSecurityDescriptor := nil;
24   sa.bInheritHandle := true;
25   if (not CreatePipe(hRead, hWrite, @sa, 0)) then
26     Exit;
27 
28   pcCommand1 := 'Cmd.exe /C ';
29   ZeroMemory(@cCommand[0], length(cCommand));
30   CopyMemory(@cCommand[0], pcCommand1, strlen(pcCommand1));
31   CopyMemory(@cCommand[strlen(pcCommand1)], pcDosCmd, strlen(pcDosCmd));
32   cCommand[strlen(pcCommand1) + strlen(pcDosCmd)] := chr(0);
33 
34   si.cb := sizeof(STARTUPINFO);
35   GetStartupInfo(si);
36   si.hStdError := hWrite;            //把创建进程的标准错误输出重定向到管道输入
37   si.hStdOutput := hWrite;           //把创建进程的标准输出重定向到管道输入
38   si.wShowWindow := SW_HIDE;
39   si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
40   //关键步骤,CreateProcess函数参数意义请查阅MSDN 
41   if (not CreateProcess(nil, cCommand, nil, nil, true, 0, nil, nil, si, pi)) then
42   begin
43     CloseHandle(hWrite);
44     CloseHandle(hRead);
45     Exit;
46   end;
47   CloseHandle(hWrite);
48 
49   iLen01 := 0;
50 {
51   while (true) do
52   begin
53     //ZeroMemory(@cBuffer[0], length(cBuffer));
54     if (not ReadFile(hRead, cBuffer[0], 4095, bytesRead, nil)) then
55       break;
56     //cBuffer[bytesRead] := chr(0);
57     //cBuffer中就是执行的结果,可以保存到文本,也可以直接输出
58     //Memo1.Lines.Add(cBuffer);   //这里是弹出对话框显示
59     CopyMemory(@buf01[iLen01], @cBuffer[0], bytesRead);
60     iLen01 := iLen01 + bytesRead;
61   end;
62   buf01[iLen01] := chr(0);
63   Memo1.Lines.Add(buf01);
64 }
65   while (true) do
66   begin
67     Sleep(2000);
68     ZeroMemory(@cBuffer[0], length(cBuffer));
69     if (not ReadFile(hRead, cBuffer[0], 4095, bytesRead, nil)) then
70       break;
71     cBuffer[bytesRead] := chr(0);
72     //cBuffer中就是执行的结果,可以保存到文本,也可以直接输出
73     Memo1.Lines.Add(inttostr(GetTickCount)+' : '+cBuffer);   //这里是弹出对话框显示
74   end;
75 
76   CloseHandle(hRead); 
77   Result := true;
78 
79   dwExitCode := 0;
80   WaitForSingleObject(pi.hProcess, INFINITE);
81   Windows.GetExitCodeProcess(pi.hProcess, dwExitCode);
82   Memo1.Lines.Add('子进程 退出码 : '+inttostr(dwExitCode));
83 end;

 

 

 

A

转载于:https://www.cnblogs.com/CodeSkill/p/4947448.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/1327.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息