System("dotnetprogramm mit rückgabewert") verstecken



  • moin

    erstmal die grundsituation:
    ich habe eine C++ Programm aus dem ich ein DotNetProgramm mit 3 Parametern aufrufen möchte. Dies würde ich glaube am besten über
    system("programm para1 para2 para3");
    machen. Nun möchte ich aber das dieser aufruf versteckt ausgeführt wird.
    Und das Programm das ich aufrüfe liefert eine 0 oder eine 1 als rückgabe wert.

    dazu hätte ich ein paar fragen:

    1.) geht das überhaupt so wie ich mir das vorstelle?
    sowohl aufruf als auch parameter als auch die rückgabe abfangen?

    2.) verstecken der console kann man ja indem man : "ATTRIB +H Programm" macht.
    Ist das der richtige Weg?

    3.) wie bekomme ich den Rückgabewert des Programms abgefragt?

    mfg LT



  • Du möchtest, dass der Anwender nicht sieht, dass irgendwo eine Konsole oder Fenster aufgeht, während das Programm läuft? Außerdem möchtest du, dass das aufrufende Programm den Rückgabewert des aufgerufenen .NET Programms bekommt um damit weiterarbeiten zu können?

    Edit:
    Ist das aufgerufene Programm eine Konsolen- oder Windows Forms Anwendung?



  • ad 1: Ja, geht. Aber nur mit plattformabhängigen Funktionen. Unter Windows z.B. mit CreateProcess.

    ad 2: Mit "ATTRIB +H" kannst du ein File "verstecken". Aber doch nicht das Konsolenfenster das aufgeht wenn dieses File gestartet wird. Wie kommst du denn auf die Idee 😕

    ad 3: Unter Windows z.B. mit GetExitCodeProcess.



  • 2.) ich komm auf die idee indem ich gegooglt hab ...
    wenn man "c++ konsole verstecken" googlt kommt genau diese variante...

    wie mache ich das dann ?



  • LordTerra schrieb:

    2.) ich komm auf die idee indem ich gegooglt hab ...
    wenn man "c++ konsole verstecken" googlt kommt genau diese variante...

    wie mache ich das dann ?

    http://lmgtfy.com/?q=c%2B%2B+hide+console+window



  • BOOL TestAufruf(){
    
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    
    	ZeroMemory( &si, sizeof(si) );
    	si.cb = sizeof(si);
    	ZeroMemory( &pi, sizeof(pi) );
    	CString ausg;
    
    	LPSTR befehl = "C:\\Argus\\test.bat";
    	if (!CreateProcess(NULL, befehl, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )) {
    		ausg.Format("CreateProcess ging schief wegen Fehler Nr. %d", GetLastError());
    		AfxMessageBox(ausg);
    		return 0;
    	}
    
    	ausg.Format("Alles ok, PID=%d\n", pi.dwProcessId);
    	AfxMessageBox(ausg);
    
    	DWORD exitCode;
    	if(!GetExitCodeProcess(pi.hProcess, &exitCode)){
    		ausg.Format("Exit code = %X\n", exitCode);
    		AfxMessageBox(ausg);
    	}
    	CloseHandle( pi.hProcess );
    	CloseHandle( pi.hThread );
    	return 1;
    }
    

    so das hab ich bisher...
    kann das so funktionieren?
    weil woher weis mein programm wann das andere programm fertig is?
    müsste da nicht irgend nen whileschleife rein die überprüft ob das programm fertig ist?



  • Nö, so wirst du vermutlich immer STILL_ACTIVE (259) als Exit-Code bekommen.

    D.h. du solltest vor GetExitCodeProcess darauf warten dass der Prozess fertig ist, mit

    WaitForSingleObject(pi.hProcess, INIFINITE);
    

    Weiters ist ein Batch-File kein Programm => cmd.exe mit Parametern /c MeinBatchFile.bat batchFileParameter1 batchFileParameter2 ...

    Und natürlich musst du CreateProcess jetzt noch mitgeben dass du bitte kein Fenster haben willst.


Log in to reply