Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何正确地称呼;telnet“;使用CreateProcess函数?_Winapi_Command Line_Cmd_Telnet_Createprocess - Fatal编程技术网

Winapi 如何正确地称呼;telnet“;使用CreateProcess函数?

Winapi 如何正确地称呼;telnet“;使用CreateProcess函数?,winapi,command-line,cmd,telnet,createprocess,Winapi,Command Line,Cmd,Telnet,Createprocess,我想通过cmd.exe启动“telnet”,并将此命令执行的结果写入文件。当我运行“ipconfig”命令时,我得到了我需要的所有信息,但在运行“telnet”命令后,我只得到了一个空文件 这是我的密码: #include "windows.h" #include "iostream" void SaveResult(const wchar_t *fileName, const wchar_t *commandLine) { SECURITY_ATTRIBUTES sa; sa

我想通过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;
}
#包括“windows.h”
#包括“iostream”
void SaveResult(常量wchar\u t*文件名,常量wchar\u t*命令行)
{
安全(a);
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
HANDLE h=CreateFile(文件名、文件写入数据、文件共享写入、文件共享读取、,
&sa,始终打开,文件属性正常,空);
if(h==无效的\u句柄\u值)
返回;
进程信息pi={0};
STARTUPINFO si={sizeof(si)};
si.dwFlags |=STARTF_USESTDHANDLES;
si.hStdInput=NULL;
si.hStdError=h;
si.hst输出=h;
wchar\u t*可写的\u cmdline=\u wcsdup(命令行);
BOOL success=CreateProcess(空,可写\u cmdline,
NULL,NULL,TRUE,创建\u否\u窗口,NULL,NULL,&si,&pi);
bool finished=false;
//等一秒钟
对于(int i=0;i<10;i++)
{

如果(WaitForSingleObject(pi.hProcess,100)您是否已在cmd控制台中直接运行telnet命令?是否有任何输出?如果是,则可能是因为缓冲区尚未刷新到该文件,因此空文件。As@David指出,, 您只需等待1s,但如果要连接的时间超过1s,则将关闭处理程序而不刷新缓冲区。请尝试在
CloseHandle(h)
之前添加
FlushFileBuffers(h)

对于
WaitForSingleObject
,您可以尝试
WaitForSingleObject(pi.hProcess,INFINITE)
,等待telnet进程退出。

这里有很多非常奇怪的代码。不检查
success
的值是一个坏的开始。这样做。如果
CreateProcess
失败,请调用
GetLastError
以找出原因。调用
WaitForSingleObject
10次是没有意义的。调用一次,超时时间再延长10次。小心我希望1足够了。如果不是呢?如果
CreateProcess
失败调用
WaitForSingleObject
if
CreateProcess
是错误的。最后,新手程序员缺乏的最重要的技能是调试。花些时间来学习如何调试程序。你还需要什么?WinAPI提供了直接的internet访问