在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;
是不是就是你簡單可靠的方法啊???哈哈哈~~~~有趣!