现在要运行一个基于命令行的程序,使用system函数,启动后出现一个dos窗口,由于时间比较长,不美观,想要隐藏这个窗口,不知道有什么办法。用其他的函数(如shellexec)不知道是否可行。

解决方案 »

  1.   

    system函数好象没有提供这样的功能
    你可以使用CreateProcess来启动一个进程
    BOOL CreateProcess(
      LPCTSTR lpApplicationName,                 // name of executable module
      LPTSTR lpCommandLine,                      // command line string
      LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
      LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
      BOOL bInheritHandles,                      // handle inheritance option
      DWORD dwCreationFlags,                     // creation flags
      LPVOID lpEnvironment,                      // new environment block
      LPCTSTR lpCurrentDirectory,                // current directory name
      LPSTARTUPINFO lpStartupInfo,               // startup information
      LPPROCESS_INFORMATION lpProcessInformation // process information
    );
    把dwCreationFlags这个参数设置为CREATE_NO_WINDOW
    这个对console程序有效,对纯DOS下的程序无效希望对你有所帮助!
      

  2.   

    使用WinExec可以的,不过你得知道使用的应用程序的名称
      

  3.   

    ShellExecute(..................., SW_HIDE)
      

  4.   

    用这个 WinExec("xxx.exe", 0); 我用过不会显示 Dos 程序的窗体。
      

  5.   

    也可以使用ShellExecute();ShellExecute(NULL, NULL,"xxx.exe", NULL, NULL, SW_SHOWNORMAL);
      

  6.   

    ShellExecute,WinExce都可以达到这个要求
      

  7.   

    ShellExecute(NULL, NULL,"xxx.exe", NULL, NULL, SW_HIDE);
    WinExec("xxx.exe", SW_HIDE);
      

  8.   

    要是我就使用CreateProcess函数,不但可以达到你的功能,还能重新定向标准的输入输出等等,因为有时候你不但要执行他,还要获取他执行的结果啊
    BOOL CreateProcess(
      LPCTSTR lpApplicationName,                 // name of executable module
      LPTSTR lpCommandLine,                      // command line string
      LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
      LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
      BOOL bInheritHandles,                      // handle inheritance option
      DWORD dwCreationFlags,                     // creation flags
      LPVOID lpEnvironment,                      // new environment block
      LPCTSTR lpCurrentDirectory,                // current directory name
      LPSTARTUPINFO lpStartupInfo,               // startup information
      LPPROCESS_INFORMATION lpProcessInformation // process information
    );
    通过后两个参数你可以做很多有意义的事
      

  9.   

    用CreateProcess,最后一个参数有进程句柄。调用WaitForSingleObject即可,如:
    PROCESS_INFORMATION pi={0};
    if(CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,NULL,NULL,NULL,&s,&pi))
    {
    WaitForSingleObject(pi.hProcess ,INFINITE); 
    //等待进程执行完毕 
    CloseHandle(pi.hProcess ); 
    CloseHandle(pi.hThread ); 
    }
      

  10.   

    是的,和上面几位一样,此时我推荐使用 CreateProcess 来代替 system 设置创建时的参数为 CREATE_NO_WINDOW 来阻目 Dos 窗口的显示,如下所示 :STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof STARTUPINFO;PROCESS_INFORMATION pi;
    BOOL res = CreateProcess(NULL,
    "c:\\winnt\\system32\\cmd.exe", // 执行你的 dos 命令
    NULL,
    NULL,
    NULL,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,
    NULL,
    NULL,
    &si,
    &pi);if (TRUE == res)
    {
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    }
    不要忘记了释放资源哦, good luck. ^_^