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