Konsolen Aplikation starten & steuern



  • Hallo,

    ich würde gernen mit meinem Programm eine VPN Verbindung aufbauen.
    Ich habe mich dazu entschieden diese via openVPN zu realisieren.

    Ansich ist es kein Problem die das ganze über ShellExecuteA zu bewerkstelligen.
    Nur nachdem ich die openVPN.exe mit dem verweis auf die "config-File" starte muss
    ich ja noch das pwd eingeben. Genau da liegt im Moment das Problem. Habe ich
    irgendwie eine Möglichkeit Eingabebefehle an die Konsole so senden?

    Mir wäre sonst noch spontan eingefallen das erstellte Fenster auf aktiv zu setzten und via Hooks die Befehle zu "simulieren". Allerdings klingt das eher nach einem "Hineinprügeln".

    Eine saubere Methode wäre klasse 😉



  • Habe ich
    irgendwie eine Möglichkeit Eingabebefehle an die Konsole so senden

    Nein. An den Prozess schon eher. Diesfalls ab nach WinAPI zu CreateProcess und Konsorten, da kannst die Standard-Streams für den neuen Prozess festlegen.

    Aber irgendwie ist das hässlich. Nachdem du sowieso den OpenVPN-Quellcode hast, kannst du es auch gleich einlinken.



  • In Version 2.0 werde ich sicherlich versuchen in wie weit meine Kenntnisse ausreichen um den openVPN Code zu nutzen bzw. komplett zu implementieren.

    Vorerst muss die alternative Variante herhalten.

    Ich hab es jetzt mal über die CreateProcess Variante versucht zu realisieren.

    int TForm1::start()
    {
    	STARTUPINFO    si;
    	SECURITY_ATTRIBUTES sa;
    	HANDLE hPipeOutRead,hPipeOutWrite, hPipeInRead, hPipeInWrite;
    	char cPipeResult[BUFSIZE], cPipeWrite[BUFSIZE];
    	DWORD dwBytesRead, dwBytesWrote;
    	FILE *output = NULL;
    
    	cPipeWrite[0] = 'd';
    	cPipeWrite[1] = 'i';
    	cPipeWrite[2] = 'r';
    	cPipeWrite[3] = '\n';
    
    	AnsiString pipeOut, pipeIn;
    	//cPipeWrite = message.c_str();
    
    	//
    	// Erstellen der Pipe
    	sa.nLength=sizeof(sa);
    	sa.bInheritHandle=TRUE;
    	sa.lpSecurityDescriptor=NULL;
    	if(!CreatePipe(&hPipeOutRead,&hPipeOutWrite, &sa, 0))
    		memAusgabe->Lines->Add( "Fehler: " + GetLastError() );
    	if(!CreatePipe(&hPipeInRead,&hPipeInWrite, &sa, 0))
    		memAusgabe->Lines->Add("Fehler: " + GetLastError() ) ;
        //
    	// Erstellen des Prozesses
    	si.cb=sizeof(STARTUPINFO);
    	si.lpReserved=NULL;
    	si.lpDesktop=NULL;
    	si.lpTitle=NULL;
        si.dwX=0;
    	si.dwY=0;
        si.dwXSize=640;
    	si.dwYSize=400;
        si.dwXCountChars=0;
    	si.dwYCountChars=0;
        si.dwFillAttribute=NULL;
    	si.dwFlags=STARTF_USESTDHANDLES;
        si.wShowWindow=SW_HIDE;
    	si.cbReserved2=0;
        si.lpReserved2=NULL;
    	si.hStdInput=hPipeInRead;
        si.hStdOutput=hPipeOutWrite;
    	si.hStdError=GetStdHandle(STD_ERROR_HANDLE);
    
    	CreateProcess(NULL, "cmd", NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
    	WaitForSingleObject(pi.hProcess, 1000);
    	memset(cPipeResult,0,BUFSIZE);
    	ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL);
    
    	pipeOut = cPipeResult;
    	memAusgabe->Lines->Add( pipeOut );
    	//cout << cPipeResult;
    
    	while(true)
    	{
    		memset(cPipeWrite, 0, BUFSIZE);
    		cin>>cPipeWrite;
    		cPipeWrite[strlen(cPipeWrite)] = '\n';
    		if(!WriteFile(hPipeInWrite,cPipeWrite, sizeof(cPipeWrite),&dwBytesWrote,NULL))
    			memAusgabe->Lines->Add( "Fehler: " + GetLastError() );
    
    		WaitForSingleObject(pi.hProcess, 1000);
    		memset(cPipeResult,0,BUFSIZE);
    		if( !ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL) )
    			memAusgabe->Lines->Add( "Fehler: " + GetLastError() );
    		memAusgabe->Lines->Add( cPipeResult );
    	}
    
    	//system("pause");
    	return 0;
    }
    

    Ich habe dazu mal ein Snippet verwendet was ich hier im Forum gefunden habe.
    Ich sehe zwar die standart Ausgabe der DOS Box in meinem Memofeld allerdings nicht den Befehl "dir" und zu dem hängt das Programm beim 3 Durchlauf von

    if( !ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL) )
    

    Leider bin ich auf dem Gebiet Streams/Pipes nicht sonderlich Fit... Habe also gerade keine Ahnung wo das "Problem" liegt. Hat jemand eine Idee?



  • Leider bin ich auf dem Gebiet Streams/Pipes nicht sonderlich Fit...

    Man kann nicht alles wissen. Ich bin leider in der WinAPI nicht sonderlich fit. Und bevor ich jetzt durch den Code steige (was die halbe Nacht dauern würde), bitte ich mal die Mods, den Thread nach WinAPI zu verschieben. Die Leute dort kennen sich damit wirklich besser aus.



  • Das wäre Klasse denn leider bin ich immer noch nicht weiter gekommen 😞



  • Scheint mir ein sehr unbeliebtes Thema zu sein... 😉


Anmelden zum Antworten