请问如何将createprocess的执行结果保存到一个文件中? 高手们,帮帮忙,谢谢啦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CreateProcess的执行结果是BOOL型,不知道写入文件有什么意义,如果要写那就是先用一个BOOL型变量保存返回值,然后取变量地址作为缓冲区指针,取sizeof(变量)作为要写入数据的长度。 如果楼主说的是控制台程序返回信息的话,可以参考我的这个例子// 以太工作室 东东// 函数:Ping// 参数:// szTarget目标地址(可以是域名、IP地址)// dwTime返回时间;如果是超时,等于INFINITEBOOL 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;} 我是这个意思,比如说我敲了"ipconfig"结果是:Windows IP ConfigurationEthernet 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 ? 上面给你的例子就是啊你把运行命令改为ipconfigif(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 无线网络连接: 再问,我在实现通信的基础上,服务器端能不能用createprocess执行客户端的cmd命令? LineDDA绘制流动蚂蚁线 NetMeeting 组件在安装系统时是否已经注册了? 为什么vc2005CString相加不了 问一个简单问题:时间类型转化 对话框中加入Crichedit后,字体不按设计时的大小显示,怎样才能让对话框和字体的大小跟设计时一样? 怎样修复恢复后的Excel文件 请问如何在CEditView里操作字符和字符串 读取设备长包数据有问题,帮忙看看吧! bho如何获取网页元素的事件和相应属性 MFC下的Web service怎么写 关于RECORDSET变量的问题 select 检测不到可读,请帮忙看一段 20行的程序
// 函数: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;
}
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 ?
上面给你的例子就是啊你把运行命令改为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 无线网络连接: