高手们,帮帮忙,谢谢啦

解决方案 »

  1.   

    CreateProcess的执行结果是BOOL型,不知道写入文件有什么意义,如果要写那就是先用一个BOOL型变量保存返回值,然后取变量地址作为缓冲区指针,取sizeof(变量)作为要写入数据的长度。
      

  2.   

    如果楼主说的是控制台程序返回信息的话,可以参考我的这个例子// 以太工作室 东东
    // 函数:Ping
    // 参数:
    //     szTarget目标地址(可以是域名、IP地址)
    //     dwTime返回时间;如果是超时,等于INFINITE
    BOOL Ping(LPCTSTR szTarget, DWORD &dwTime)
    {
        BOOL bSuccess = FALSE;
        dwTime = INFINITE;    if(szTarget == NULL)
        {
            TRACE0("Target Is NULL\n");
            return FALSE;
        }    TCHAR szCmdLine[80];
        if(_sntprintf(szCmdLine, sizeof(szCmdLine) / sizeof(TCHAR),
            _T("ping.exe -n 1 %s"), szTarget) == sizeof(szCmdLine) / sizeof(TCHAR))
        {
            TRACE0("Target Is Too Long\n");
            return FALSE;
        }    HANDLE hWritePipe = NULL;
        HANDLE hReadPipe = NULL;
        HANDLE hWriteShell = NULL;
        HANDLE hReadShell = NULL;    SECURITY_ATTRIBUTES  sa;
        memset(&sa, 0, sizeof(sa));
        sa.nLength = sizeof(sa);
        sa.bInheritHandle = TRUE;
        sa.lpSecurityDescriptor = NULL;    if(CreatePipe(&hReadPipe, &hReadShell, &sa, 0)
            && CreatePipe(&hWriteShell, &hWritePipe, &sa, 0))
        {
            STARTUPINFO            si;
            memset(&si, 0, sizeof(si));
            si.cb           = sizeof(si);
            si.dwFlags      = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
            si.hStdInput    = hWriteShell;
            si.hStdOutput   = hReadShell;
            si.hStdError    = hReadShell;
            si.wShowWindow  = SW_HIDE;
            
            PROCESS_INFORMATION    pi;
            memset(&pi, 0, sizeof(pi));
            
            int nMin = -1, nMax = -1, nAvg = -1;
            if(CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
            {
                if(WaitForSingleObject(pi.hProcess, 10000) == WAIT_OBJECT_0)
                {
                    TCHAR szBuffer[1024];
                    DWORD dwBytes;
                    if(ReadFile(hReadPipe, szBuffer, sizeof(szBuffer), &dwBytes, NULL))
                    {
                        szBuffer[dwBytes] = '\0';                    LPTSTR lpszTime = NULL;
                        lpszTime = _tcsstr(szBuffer, _T("Request timed out"));
                        if(lpszTime == NULL)
                        {
                            lpszTime = _tcsstr(szBuffer, _T("Minimum"));
                            if(lpszTime != NULL)
                            {
                                if(_stscanf(lpszTime, _T("Minimum = %dms, Maximum = %dms, Average = %dms"),
                                    &nMin, &nMax, &nAvg) == 3)
                                {
                                    TRACE3("%d, %d, %d\n", nMin, nMax, nAvg);                                dwTime = nAvg;
                                    bSuccess = TRUE;
                                }
                            }
                            else
                            {
                                TRACE0("PING FORMAT is Error\n");
                            }
                        }
                        else
                        {
                            TRACE0("PING is Time Out\n");                        bSuccess = TRUE;
                        }
                        
                    }
                }
                else
                {
                    TRACE1("Process(%d) is Time Out\n", pi.dwProcessId);
                    TerminateProcess(pi.hProcess, 0);
                }            CloseHandle(pi.hThread);
                CloseHandle(pi.hProcess);            TRACE3(_T("Minimum = %dms, Maximum = %dms, Average = %dms\n"), nMin, nMax, nAvg);
            }
        }    if(hWritePipe != NULL)
            CloseHandle(hWritePipe);
        if(hReadPipe != NULL)
            CloseHandle(hReadPipe);
        if(hWriteShell != NULL)
            CloseHandle(hWriteShell);
        if(hReadShell != NULL)
            CloseHandle(hReadShell);    return bSuccess;
    }
      

  3.   

    我是这个意思,比如说我敲了"ipconfig"结果是:Windows IP Configuration
    Ethernet adapter 本地连接 2:        Connection-specific DNS Suffix  . : domain
            IP Address. . . . . . . . . . . . : 192.168.1.100
            Subnet Mask . . . . . . . . . . . : 255.255.255.0
            Default Gateway . . . . . . . . . : 192.168.1.1Ethernet adapter 无线网络连接:        Media State . . . . . . . . . . . : Media disconnected
    我要将这些信息保存到一个文本文档里。
    还有另外一个问题,我调用的createprocess函数,是为客户端执行的(我现在只能启动本地的cmd),我想请问一下,我怎样能在服务器端启动客户端的cmd ?
      

  4.   


    上面给你的例子就是啊你把运行命令改为ipconfig
    if(ReadFile(hReadPipe, szBuffer, sizeof(szBuffer), &dwBytes, NULL))
    {
        szBuffer[dwBytes] = '\0';
        // 这里就得到了返回的字符串
        // Ethernet adapter 本地连接 2: 
    // 
       // Connection-specific DNS Suffix  . : domain 
          // IP Address. . . . . . . . . . . . : 192.168.1.100 
            // Subnet Mask . . . . . . . . . . . : 255.255.255.0 
            // Default Gateway . . . . . . . . . : 192.168.1.1 
    // 
    // Ethernet adapter 无线网络连接: 
      

  5.   

    再问,我在实现通信的基础上,服务器端能不能用createprocess执行客户端的cmd命令?