如何使用 CreateProcess 函数正确调用"telnet"?



我想通过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 finishn");
}

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;
}

是否直接在cmd控制台中运行telnet命令?有什么输出吗?如果是,空文件可能是因为缓冲区尚未刷新到该文件。As@David指出,您只需等待1s,但如果要连接的1s以上,则将关闭处理程序而不刷新缓冲区。尝试在CloseHandle(h)之前添加FlushFileBuffers(h)。对于WaitForSingleObject,您可以尝试WaitForSingleObject(pi.hProcess, INFINITE),等待telnet进程退出。

最新更新