【发布时间】:2019-05-04 21:49:48
【问题描述】:
我想通过 cmd.exe 启动“telnet”并将这个命令的执行结果写入文件。当我运行“ipconfig”命令时,我得到了我需要的所有信息,但在运行“telnet”命令后,我得到的只是空文件。
这是我的代码:
#include "windows.h"
#include "iostream"
void SaveResult(const wchar_t *fileName, const wchar_t *commandLine)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE h = CreateFile(fileName, FILE_WRITE_DATA, FILE_SHARE_WRITE | FILE_SHARE_READ,
&sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE)
return;
PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { sizeof(si) };
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = NULL;
si.hStdError = h;
si.hStdOutput = h;
wchar_t *writable_cmdline = _wcsdup(commandLine);
BOOL success = CreateProcess(NULL, writable_cmdline,
NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
bool finished = false;
//wait for 1 second
for (int i = 0; i < 10; i++)
{
if (WaitForSingleObject(pi.hProcess, 100) <= 0)
{
finished = true;
break;
}
}
if (success)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
CloseHandle(h);
free(writable_cmdline);
if (!finished)
printf("Process didn't finish\n");
}
int main()
{
SaveResult(L"telnet.txt", L"C:\\windows\\system32\\cmd.exe /c telnet test.com");
SaveResult(L"ipconfig.txt", L"C:\\windows\\system32\\cmd.exe /c ipconfig");
return 0;
}
【问题讨论】:
-
这里有很多非常奇怪的代码。不检查
success的值是一个糟糕的开始。去做。而CreateProcess失败,请致电GetLastError找出原因。拨打WaitForSingleObject10 次毫无意义。调用一次,超时时间长 10 倍。最好希望1s就足够了。如果不是呢?如果CreateProcess失败,则调用WaitForSingleObject是错误的。最后,新手程序员最缺乏的技能就是调试。花一些时间学习如何调试您的程序。 -
你需要这个做什么? WinAPI 提供WinINet 用于直接上网
标签: winapi command-line cmd telnet createprocess