新问题:怎样在windows下执行一条dos命令,使ms-dos窗口不出现

时间:2022-09-02 22:13:22
我可以发表新帖子啦,再问一个:(为什么没人在我加分的帖子里解答呢?:(
没办法只有再给100分啦,请大家给我一个可行的方案:)


新问题:
请问,怎样在windows下执行一条dos命令,使ms-dos窗口不出现

比如要执行这条怎么办?
masm fliename.asm;>result.txt  

songhtao(三十年孤独) 回复于2001-6-10 16:25:00   
用ShellExecute
加上SW_HIDE参数。  

可是:!!!!!!!!!!!!!!!!!!!
flyingsouth(飞呀) 回复于2001-6-10 16:33:00   
我用了ShellExecute但是不能执行??为什么
请给个详细的实例,救救我吧:(
 

41 个解决方案

#1


你是如何写的?

#2


用CreateProcess函数
将STARTUPINFO结构的.dwFlags设为1,这样就 不出现了

#3


其实我就是想得到这条dos命令的执行输出结果,并把结果在windows下的窗体中显示(比如在listbox,或memo,执行时又不能有那个黑窗口闪过

我的最笨的而且有问题的方法是:我用system("masm filename.asm;>result.txt),得到结果保存在result.txt中,然后从result.txt中读到listbox,memo中。

有没有直接就可以的到dos命令执行输出结果并显示在windows窗口中的函数
或有其它方法可以实现吗?

请给位给个详细的实例可以吗?

#4


用创建管道的方法可以实现

#5


cdws222(赵卫)的方法最好!!不过较难!!
用winexec("命令",SW_HIDE);

#6


大家试试ShellExecute(NULL, NULL, "ping www.csdn.net > aaa", NULL, NULL, SW_SHOW);
不能成功执行ping命令并重定位输出。
有什么办法可以解决这个问题呀? 
用system可以成功,但不能隐藏dos窗口。
用winexec命令不进行重定向可以成功,但一旦重定向就失败。

#7


救命,实例,实例!!!!

#8


不要用你自己想的这样的方法
直接用管道,可以获得另外一个进程的输出结果
xixi~~我想你的分应该拿来了:)

假设我先创建这么一个程序,名字叫test,生成test.exe,放在d盘下
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop
#include <condefs.h>

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
 int i;
 for(i=0;i<10;i++)
   {
    printf("Logging %d\n",i);
    cout<<"Output Line:"<<i<<endl;
    cerr<<"Error Line:"<<i<<endl;
   }
 return 0;
}

//实际上什么也没有做,只是有输出

#9


然后,我们这样做:)

(等一下,我在写代码,嘿嘿~~)

#10


我等呢...期待中...

#11


TMD!!!!!!该死的BCB出问题了!!!!!!!!!!!!!!!!!!!
这段代码暂时没有办法验证,但是应该就是这样子了^_^
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        STARTUPINFO myStartup;
        PROCESS_INFORMATION myInfo;
        HANDLE hRead,hWrite,hTmp;
        bool bReturn;
        char readBuf[100];
        DWORD bytesRead=0;

        //创建匿名管道
        if(CreatePipe(&hRead,&hWrite,NULL,0))//系统默认缓冲大小
                ShowMessage("Pipe Created OK ");
        else
                ShowMessage("Pipe Creation Error");

        //获取当前进程的标准输出
        hTmp=GetStdHandle(STD_OUTPUT_HANDLE);
        //把标准输出设置给管道
        SetStdHandle(STD_OUTPUT_HANDLE,hWrite);

        GetStartupInfo(&myStartup);
        bReturn = CreateProcess("d:\\test.exe",NULL,NULL,NULL,true,
                       CREATE_NEW_CONSOLE,
                       NULL,NULL,&myStartup,&myInfo);

        SetStdHandle(STD_OUTPUT_HANDLE,hTmp);

        if(bReturn)
                ShowMessage("Create Process OK");
        else
                ShowMessage("CreateProcess error:"+IntToStr(GetLastError()));

        CloseHandle(hWrite);
        Memo1->Text = "";
        while(ReadFile(hRead,readBuf,100,&bytesRead,NULL)){
                readBuf[bytesRead] = '\0';
                Memo1->Text = Memo1->Text+ "Read " + IntToStr(bytesRead)
                + "bytes from pipe" + readBuf;
        }

        if(GetLastError()==ERROR_BROKEN_PIPE)
                ShowMessage("Pipe closed by child process");
        else
                ShowMessage("Read error" + IntToStr(GetLastError()));
}
//---------------------------------------------------------------------------

#12


不知道有没有问题,但是这样的解决方法一定可以!

我要吃饭去了,xixi~~~你慢慢看吧~~

#13


我才吃饭回来,呵呵rh(有花须酌酒)大概还才赏花酌酒吧!我现在开始看了

#14


使用匿名管道。
唉,喝了顿酒回来,丢了大堆的分哪。

#15


rh(有花须酌酒),运行时还是有哪个窗口:(

#16


用CreateProcess函数
将STARTUPINFO结构的.dwFlags设为1,这样就不出现了 

我的代码里是这样填充这个结构的
GetStartupInfo(&myStartup);
        
要隐藏的话,你要这样加:
GetStartupInfo(&myStartup);
        myStartup.wShowWindow = SW_HIDE;//加这句!!!
        bReturn = CreateProcess("d:\\test.exe",NULL,NULL,NULL,true,
                       CREATE_NEW_CONSOLE,
                       NULL,NULL,&myStartup,&myInfo);

#17


嘿嘿~~拷贝失误,上面的话应该是:
用CreateProcess函数
将STARTUPINFO结构的.dwFlags设为1,这样就不出现了 


有误,应该是设置wShowWindow

#18


能得到结果吗

#19


还是的不到结果,运行完程序会停止响应:(

#20


黑窗是没有啦,但没结果

#21


把STARTUPINFO结构的.wShowWindow=SW_HIDE,这样就不出现了 

#22



STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
HANDLE hReadPipe;
HANDLE hWritePipe;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
CreatePipe(&hReadPipe,&hWritePipe,&sa,2500000);
memset(&si,0,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdOutput = hWritePipe;
CreateProcess ( ... )

// read output from DOS app here
while (!done)
{
memset(buffer,0,4000);

PeekNamedPipe(hReadPipe,&buffer,sizeof(buffer),&bytes_read,&avail,&unread);
if (bytes_read)
{
ReadFile(hReadPipe,&buffer,sizeof(buffer),&bytes_read,NULL);
}
if (bytes_read < 4000)
done = true;
}
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);

#23


ShellExecute(0,0,"command.com  /c  masm ",0,0,SW_HIDE);
SW_HIDE就不会出现窗口了
command.com /c   保证执行结束后进程能消失
 

#24


关注

#25


我也在想这样的问题,

#26


BCB(:))窗口没有了,但是不能的到运行结果的信息

#27


 to songhtao(三十年孤独) 
   ShellExecute(Handle,NULl,"command ","/c ping HostName  >aa.txt",NULL,SW_HIDE;

 1. 该函数的命令和参数是分开写的
 2. command /c 会让命令执行完结束

#28


rh(有花须酌酒)的方法还是没有程序执行结果信息

#29


我把ShellExecute的参数方式跟WinExec搞混了
LIUTAO2002(小刘)的对!

#30


#include "stdafx.h"
#include <direct.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <process.h>
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
char command[]="a dos command";
WinExec(command,0);
}

#31


我现在正在重新安装BCB
慢点要去上课
等我放学回来,看看

使用管道,绝对是正解
我的程序不能得到结果
只是说明我水平不够
与“管道”的能力无关^_^

#32


greentrees(真稀奇) 的也不行:(

#33


这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!

char command[]="c:\\mybat.bat";
WinExec(command,0);

在C盘根目录中存一个批文件mybat.bat
内容是:
masm fliename.asm;>result.txt  


这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!

#34


救命啊

#35


哈哈哈哈~~~~给分来!!!!!!
以下代码,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 = &pi;
        //创建管道
        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);
}
//---------------------------------------------------------------------------

#36


我的怎么不行?我就是这样用的好多年了

#37


是什么DOS命令?

#38


谢谢大家的回复!

#39


你的落后啦:)xixi~~~

#40


谢谢LIUTAO2002(小刘)终于成功了

#41


g

#1


你是如何写的?

#2


用CreateProcess函数
将STARTUPINFO结构的.dwFlags设为1,这样就 不出现了

#3


其实我就是想得到这条dos命令的执行输出结果,并把结果在windows下的窗体中显示(比如在listbox,或memo,执行时又不能有那个黑窗口闪过

我的最笨的而且有问题的方法是:我用system("masm filename.asm;>result.txt),得到结果保存在result.txt中,然后从result.txt中读到listbox,memo中。

有没有直接就可以的到dos命令执行输出结果并显示在windows窗口中的函数
或有其它方法可以实现吗?

请给位给个详细的实例可以吗?

#4


用创建管道的方法可以实现

#5


cdws222(赵卫)的方法最好!!不过较难!!
用winexec("命令",SW_HIDE);

#6


大家试试ShellExecute(NULL, NULL, "ping www.csdn.net > aaa", NULL, NULL, SW_SHOW);
不能成功执行ping命令并重定位输出。
有什么办法可以解决这个问题呀? 
用system可以成功,但不能隐藏dos窗口。
用winexec命令不进行重定向可以成功,但一旦重定向就失败。

#7


救命,实例,实例!!!!

#8


不要用你自己想的这样的方法
直接用管道,可以获得另外一个进程的输出结果
xixi~~我想你的分应该拿来了:)

假设我先创建这么一个程序,名字叫test,生成test.exe,放在d盘下
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop
#include <condefs.h>

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
 int i;
 for(i=0;i<10;i++)
   {
    printf("Logging %d\n",i);
    cout<<"Output Line:"<<i<<endl;
    cerr<<"Error Line:"<<i<<endl;
   }
 return 0;
}

//实际上什么也没有做,只是有输出

#9


然后,我们这样做:)

(等一下,我在写代码,嘿嘿~~)

#10


我等呢...期待中...

#11


TMD!!!!!!该死的BCB出问题了!!!!!!!!!!!!!!!!!!!
这段代码暂时没有办法验证,但是应该就是这样子了^_^
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        STARTUPINFO myStartup;
        PROCESS_INFORMATION myInfo;
        HANDLE hRead,hWrite,hTmp;
        bool bReturn;
        char readBuf[100];
        DWORD bytesRead=0;

        //创建匿名管道
        if(CreatePipe(&hRead,&hWrite,NULL,0))//系统默认缓冲大小
                ShowMessage("Pipe Created OK ");
        else
                ShowMessage("Pipe Creation Error");

        //获取当前进程的标准输出
        hTmp=GetStdHandle(STD_OUTPUT_HANDLE);
        //把标准输出设置给管道
        SetStdHandle(STD_OUTPUT_HANDLE,hWrite);

        GetStartupInfo(&myStartup);
        bReturn = CreateProcess("d:\\test.exe",NULL,NULL,NULL,true,
                       CREATE_NEW_CONSOLE,
                       NULL,NULL,&myStartup,&myInfo);

        SetStdHandle(STD_OUTPUT_HANDLE,hTmp);

        if(bReturn)
                ShowMessage("Create Process OK");
        else
                ShowMessage("CreateProcess error:"+IntToStr(GetLastError()));

        CloseHandle(hWrite);
        Memo1->Text = "";
        while(ReadFile(hRead,readBuf,100,&bytesRead,NULL)){
                readBuf[bytesRead] = '\0';
                Memo1->Text = Memo1->Text+ "Read " + IntToStr(bytesRead)
                + "bytes from pipe" + readBuf;
        }

        if(GetLastError()==ERROR_BROKEN_PIPE)
                ShowMessage("Pipe closed by child process");
        else
                ShowMessage("Read error" + IntToStr(GetLastError()));
}
//---------------------------------------------------------------------------

#12


不知道有没有问题,但是这样的解决方法一定可以!

我要吃饭去了,xixi~~~你慢慢看吧~~

#13


我才吃饭回来,呵呵rh(有花须酌酒)大概还才赏花酌酒吧!我现在开始看了

#14


使用匿名管道。
唉,喝了顿酒回来,丢了大堆的分哪。

#15


rh(有花须酌酒),运行时还是有哪个窗口:(

#16


用CreateProcess函数
将STARTUPINFO结构的.dwFlags设为1,这样就不出现了 

我的代码里是这样填充这个结构的
GetStartupInfo(&myStartup);
        
要隐藏的话,你要这样加:
GetStartupInfo(&myStartup);
        myStartup.wShowWindow = SW_HIDE;//加这句!!!
        bReturn = CreateProcess("d:\\test.exe",NULL,NULL,NULL,true,
                       CREATE_NEW_CONSOLE,
                       NULL,NULL,&myStartup,&myInfo);

#17


嘿嘿~~拷贝失误,上面的话应该是:
用CreateProcess函数
将STARTUPINFO结构的.dwFlags设为1,这样就不出现了 


有误,应该是设置wShowWindow

#18


能得到结果吗

#19


还是的不到结果,运行完程序会停止响应:(

#20


黑窗是没有啦,但没结果

#21


把STARTUPINFO结构的.wShowWindow=SW_HIDE,这样就不出现了 

#22



STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
HANDLE hReadPipe;
HANDLE hWritePipe;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
CreatePipe(&hReadPipe,&hWritePipe,&sa,2500000);
memset(&si,0,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdOutput = hWritePipe;
CreateProcess ( ... )

// read output from DOS app here
while (!done)
{
memset(buffer,0,4000);

PeekNamedPipe(hReadPipe,&buffer,sizeof(buffer),&bytes_read,&avail,&unread);
if (bytes_read)
{
ReadFile(hReadPipe,&buffer,sizeof(buffer),&bytes_read,NULL);
}
if (bytes_read < 4000)
done = true;
}
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);

#23


ShellExecute(0,0,"command.com  /c  masm ",0,0,SW_HIDE);
SW_HIDE就不会出现窗口了
command.com /c   保证执行结束后进程能消失
 

#24


关注

#25


我也在想这样的问题,

#26


BCB(:))窗口没有了,但是不能的到运行结果的信息

#27


 to songhtao(三十年孤独) 
   ShellExecute(Handle,NULl,"command ","/c ping HostName  >aa.txt",NULL,SW_HIDE;

 1. 该函数的命令和参数是分开写的
 2. command /c 会让命令执行完结束

#28


rh(有花须酌酒)的方法还是没有程序执行结果信息

#29


我把ShellExecute的参数方式跟WinExec搞混了
LIUTAO2002(小刘)的对!

#30


#include "stdafx.h"
#include <direct.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <process.h>
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
char command[]="a dos command";
WinExec(command,0);
}

#31


我现在正在重新安装BCB
慢点要去上课
等我放学回来,看看

使用管道,绝对是正解
我的程序不能得到结果
只是说明我水平不够
与“管道”的能力无关^_^

#32


greentrees(真稀奇) 的也不行:(

#33


这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!

char command[]="c:\\mybat.bat";
WinExec(command,0);

在C盘根目录中存一个批文件mybat.bat
内容是:
masm fliename.asm;>result.txt  


这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!
这样就可以啦!加分加分加分啊!

#34


救命啊

#35


哈哈哈哈~~~~给分来!!!!!!
以下代码,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 = &pi;
        //创建管道
        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);
}
//---------------------------------------------------------------------------

#36


我的怎么不行?我就是这样用的好多年了

#37


是什么DOS命令?

#38


谢谢大家的回复!

#39


你的落后啦:)xixi~~~

#40


谢谢LIUTAO2002(小刘)终于成功了

#41


g