天天看點

在BCB中調用DOS程式(我會作)但如何将DOS程式輸出的

在BCB中調用DOS程式(我會作)但如何将DOS程式輸出的

http://www.plm.hk/phpgm/thread-3316-1-1.html

在BCB中調用DOS程式(我會作)但如何将DOS程式輸出的資訊轉到我的BCB程式中的Memo或文本框中輸出???

發表時間:2001-7-3 20:14:16

回複人:dycdyc123 | 微笑江湖

system("*.exe">>TFrom1->Memo1->Lines->Add(...));

Top

回複人:songhtao | 三十年孤獨

用管道或輸出重定向,鑒于我的項目要用到這一技術,涉及公司,不敢公開。

Top

回複人:shally5 | 我在一旁靜靜的看着你

songhtao(三十年孤獨)

你換一個名字登入,不就可以說了嗎!

我還可以加50分啊!

Top

回複人:rh | 有花須酌酒

加分來!!!這是什麼秘密技術哦!就是管道而已啦!!!

Top

回複人:rh | 有花須酌酒

http://www.csdn.net/expert/topic/153/153966.shtm,最後一段代碼

Top

回複人:rh | 有花須酌酒

在窗提上放一個memo和一個button,在button的click事件裡加上那段代碼

注意其中的

if(!CreateProcess("d://test.exe",NULL,NULL,NULL,true,CREATE_NEW_CONSOLE,

                      NULL,NULL,&myStartup,&pi)){

                ShowMessage("CreateProcess error:"+IntToStr(GetLastError()));

                return;

      }

d://test.exe  就是你需要執行的dos檔案

結果該dos程式的輸出進入了你的memo!       

Top

回複人:shally5 | 我在一旁靜靜的看着你

在Memo中沒有出現東東啊!rh(有花須酌酒)你看看是這樣嗎?

void __fastcall TForm1::Button1Click(TObject *Sender)

{

        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))

                ShowMessage("Pipe Created OK ./n");

        else{

                ShowMessage("Pipe Creation Error");

                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("c://arj.exe",NULL,NULL,NULL,true,CREATE_NEW_CONSOLE,

                      NULL,NULL,&myStartup,&pi)){

                ShowMessage("CreateProcess error:"+IntToStr(GetLastError()));

                return;

      }

}

Top

回複人:xycleo | )虛竹和尚(

對!!就是rh說的!!來晚了!!

Top

回複人:rh | 有花須酌酒

拜托!是這樣:

回複人:rh(有花須酌酒) (2001-6-12 13:22:00)  得0分

哈哈哈哈~~~~給分來!!!!!!

以下代碼,win2000下驗證通過!

xixihahaheiheihehe~~~~~

void __fastcall TForm1::Button1Click(TObject *Sender)

{

        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))

                ShowMessage("Pipe Created OK ./n");

        else{

                ShowMessage("Pipe Creation Error");

                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("d://test.exe",NULL,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->Text = Memo1->Text+ "Read " + IntToStr(bytesRead)

                                + "bytes from pipe" + readBuf;

                }else{

                        if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)

                                break;

                        Sleep(256);

                }

        }

        CloseHandle(hReadPipe);

        CloseHandle(pi.hThread);

        CloseHandle(pi.hProcess);

        CloseHandle(hWritePipe);

}

//--------------------------------------------------------------------------- 

Top

回複人:rh | 有花須酌酒

後面還有一串呢!

這技術很普遍,許多雜志都有介紹

好點的win網絡程式設計書上也有

并不是什麼秘密~~~

Top

回複人:shally5 | 我在一旁靜靜的看着你

現在有一個DOS視窗一閃而過,MEMO中還是沒有東東啊!是哪有問題呢!

我是以ARJ.EXE為DOS程式來測試的。。。。。。

void __fastcall TForm1::Button2Click(TObject *Sender)

{

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))

                ShowMessage("Pipe Created OK ./n");

        else{

                ShowMessage("Pipe Creation Error");

                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("c://arj.exe",NULL,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->Text = Memo1->Text+ "Read " + IntToStr(bytesRead)

                                + "bytes from pipe" + readBuf;

                }else{

                        if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)

                                break;

                        Sleep(256);

                }

        }

        CloseHandle(hReadPipe);

        CloseHandle(pi.hThread);

        CloseHandle(pi.hProcess);

        CloseHandle(hWritePipe);

}

Top

回複人:rh | 有花須酌酒

下面的代碼,我才調試,一定可以

void __fastcall TForm1::Button1Click(TObject *Sender)

{

        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))

                ShowMessage("Pipe Created OK ./n");

        else{

                ShowMessage("Pipe Creation Error");

                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("d://test.exe",NULL,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->Text = Memo1->Text+ "Read " + IntToStr(bytesRead)

                                + "bytes from pipe" + readBuf;

                }else{

                        if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)

                                break;

                        Sleep(256);

                }

        }

        CloseHandle(hReadPipe);

        CloseHandle(pi.hThread);

        CloseHandle(pi.hProcess);

        CloseHandle(hWritePipe);

}

//---------------------------------------------------------------------------

test.exe的代碼如下:

#include<iostream.h>

int main(int argc, char* argv[])

{

    for(int i(0);i<=100;i++)cout<<"你會看不見?????"<<endl;

    return 0;

}

//---------------------------------------------------------------------------

Top

回複人:yueyue | 風色幻想

gz

Top

回複人:songhtao | 三十年孤獨

我的方法簡單,可靠,隻有幾句話。

Top

回複人:shally5 | 我在一旁靜靜的看着你

rh(有花須酌酒)用你那個Test.exe是OK的

rh(有花須酌酒)用你那個Test.exe是OK的

但是我用ARJ.exe程式還是有問題啊?

是不是因為它是純DOS的程式呢!我又調了幾個用FORTRAN作的計算程式是可以的!

是不是必須是控制台DOS程式才可以呢?????

Top

回複人:rh | 有花須酌酒

大哥,沒有輸出的程式,你想看什麼呢?

你調用winzip32.exe試試!同樣沒有!

這段代碼能收到的,是在控制台裡有輸出的程式

就是說,這樣做:

ShellExecute(Handle,NULl,"command ","/c ping HostName  >pipe.txt",NULL,SW_HIDE;

做了之後pipe.txt裡有内容的才可以用上面的代碼得到内容

你覺得不爽的話,你盡可以自己寫arj

好了,偶回答累了,不再回答!!

to songhtao(三十年孤獨) :

ShellExecute(Handle,NULl,"command ","/c ping HostName  >pipe.txt",NULL,SW_HIDE;

是不是就是你簡單可靠的方法啊???哈哈哈~~~~有趣!