STARTUPINFO si;
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cb = sizeof(si);
ZeroMemory(&si, sizeof(si)); 
CreateProcess("c:\\test.bat", NULL,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess, INFINITE);以上语句在2000下可以隐藏dos窗口,但在98下不行。
请教是什么原因造成的。

解决方案 »

  1.   

    98下,CreateProcess调用DOS shell 来执行.bat,就像
    ShellExecute
      

  2.   


    C:\Documents and Settings\Smallfrogs>start /?
    启动另一个窗口运行指定的程序或命令。START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
          [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
          [/WAIT] [/B] [command/program]
          [parameters]    "title"     在窗口标题栏中显示的标题。
        path        起始目录
        B           在不创建新窗口的情况下开始应用程序。 除非
                    启动 ^C 处理,否则该应用程序会忽略 ^C 处理;
                     ^Break 是唯一可以中断该应用程序的方式
        I           新环境是传递给 cmd.exe 的原始环境,
                    而不是当前环境
        MIN         开始时窗口最小化
        MAX         开始时窗口最大化
        SEPARATE    在分开的空间内开始 16 位 Windows 程序
        SHARED      在分共享的空间内开始 16 位 Windows 程序
        LOW         在 IDLE 优先级类别开始应用程序
        NORMAL      在 NORMAL 优先级类别开始应用程序
        HIGH        在 HIGH 优先级类别开始应用程序
        REALTIME    在 REALTIME 优先级类别开始应用程序
        ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序
        BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序
        WAIT        启动应用程序并等候它结束
        command/program
                    如果是内部 cmd 命令或批文件,那么该命令处理器是
                    用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在命令运行
                    后仍然存在。                如果不是内部 cmd 命令或批文件,则是一个程序,并
                    作为窗口应用程序或控制台应用程序运行。    parameters  这些为传送到命令/程序的参数
    如果命令扩展名被启用,通过命令行或 START 命令的外部命令
    调用会如下改变:将文件名作为命令键入,非可执行文件    可以通过文件关联调用。
        (例如, WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
        关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
         FTYPE 命令。执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用
        程序终止就返回命令提示。如果在命令脚本内执行,该新行为
        则不会发生。如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
        字符串 "CMD","CMD" 会被COMSPEC 变量的数值所替换。这
        防止从当前目录抓出 CMD.EXE。如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
        PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
        名。PATHEXT 变量的默认值是:        .COM;.EXE;.BAT;.CMD    请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
    与目录名相配。如果确实如此,START 会在那个路径上调用
    Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。
      

  3.   

    楼主还是用WinExec吧,函数模型如下:UINT WinExec(
      LPCSTR lpCmdLine,
      UINT uCmdShow
    );能够像执行DOS命令一样运行,lpCmdLine,可以是程序名,也可以是DOS命令,也可以是BAT文件
    第二个参数如果改为SW_HIDE,就能隐藏DOS那种窗口。
      

  4.   

    判断操作系统版本
    98下用ShellExecute
      

  5.   

    WinExec跟ShellExecute都不行。我要等那个bat运行完毕程序才能继续运行的。
      

  6.   

    up,大家帮我出出主意。
    如果真不能实现,能不能把dos窗口最小化啊。
      

  7.   

    up,我这样写在2000下dos窗口不显示了。但98却是显示的。为什么啊。
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.cb = sizeof(si);
    ZeroMemory(&si, sizeof(si)); 
    CreateProcess(sBatPath, NULL,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi);
    WaitForSingleObject(pi.hProcess, INFINITE);请教高手了。