zoukankan      html  css  js  c++  java
  • 使用WIN32 API CreateProcess()以无窗口方式创建DOS程序

    要达到DOS程序运行时不显示窗口的效果,有两种可能:
    一是创建该DOS进程时,指定不创建窗口;
    二是隐藏该DOS进程有窗口。

    根据MSDN,CreateProcess() API的原型如下:
        BOOL CreateProcess(
          LPCTSTR lpApplicationName,
          LPTSTR lpCommandLine,
          LPSECURITY_ATTRIBUTES lpProcessAttributes,
          LPSECURITY_ATTRIBUTES lpThreadAttributes,
          BOOL bInheritHandles,
          DWORD dwCreationFlags,
          LPVOID lpEnvironment,
          LPCTSTR lpCurrentDirectory,
          LPSTARTUPINFO lpStartupInfo,
          LPPROCESS_INFORMATION lpProcessInformation
        );
    将dwCreationFlags指定为CREATE_NO_WINDOW即以不创建窗口方式创建DOS进程。

    LPSTARTUPINFO lpStartupInfo参数又为STARTUPINFO结构,如下:
        typedef struct _STARTUPINFO {
          DWORD cb;
          LPTSTR lpReserved;
          LPTSTR lpDesktop;
          LPTSTR lpTitle;
          DWORD dwX;
          DWORD dwY;
          DWORD dwXSize;
          DWORD dwYSize;
          DWORD dwXCountChars;
          DWORD dwYCountChars;
          DWORD dwFillAttribute;
          DWORD dwFlags;
          WORD wShowWindow;
          WORD cbReserved2;
          LPBYTE lpReserved2;
          HANDLE hStdInput;
          HANDLE hStdOutput;
          HANDLE hStdError;
        } STARTUPINFO,*LPSTARTUPINFO;
    指定STARTUPINFO结构中WORD wShowWindow为SW_HIDE,即以不显示窗口方式创建DOS进程。

    在Visusl Studio 2005中实测的结果是:创建[CMD /C] DOS进程,第一种方式可以无窗口方式创建DOS进程,而第二种方式没有正确的隐藏DOS窗口。

    一个服务安装的实例:

        CString sCommand = """" + sServiceExeFilePath + """" + " " + "-Install";
       
        STARTUPINFO            si;
        PROCESS_INFORMATION    pi;
        memset(&si, 0, sizeof(si));
        si.cb = sizeof(si);
        if (CreateProcess(NULL, (char *)((LPCTSTR)sCommand), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
        {
            WaitForSingleObject(pi.hProcess, INFINITE);
            bRet = TRUE;
        }
       
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);

  • 相关阅读:
    spring 任务调度quartz
    java增强型for循环
    DateTimeFormat
    Java的同步和异步
    HTTP Status 400,400 (Bad Request)
    com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: '2.34435678977654336E17' in column '3' is outside valid range for the datatype INTEGER.
    Servlet.service() for servlet [appServlet] in context with path [/item] threw exception [Request processing failed
    mysql调优
    Windows nexus 启动失败
    NFS客户端访问行为相关的几个参数解释
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994572.html
Copyright © 2011-2022 走看看