Win zu Linux porten! Sehr wichtig.



  • Hallo Community,
    Ich habe hier ein kleines problem... Ich habe für Windows ein kleines Tool geschrieben das ein Prozess startet und am laufen hält. Nun brauch ich genau das selbe für Linux mit den gleichen ausgabe werten.

    CommandLine.h

    #include <windows.h>
    #include <shellapi.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    class CCommandLine { 
    private:
    	int uNumOfArgs;
    public:
    	LPWSTR * lpArgs;
    public: 
    	CCommandLine() 
    	{ 
    	} 
    public: 
    	~CCommandLine() 
    	{ 
    	} 
    public: 
    	bool LoadCommandLine(LPCWSTR lpCmdLine) {
    		lpArgs = CommandLineToArgvW(lpCmdLine, &uNumOfArgs);
    		if(lpArgs) {
    			return true;
    		}
    		return false;
    	}
    
    	char * FindParam(LPWSTR lpParam, const char * cszDefault) {
    		char * szParam = new char[2024];
    		unsigned int uPos = inArgs(lpParam, lpArgs);
    		if(uPos != 0) {
    			//Found the Param
    			wcstombs(szParam, lpArgs[uPos + 1], 2024);
    			if(strlen(szParam) == 0) {
    				//Value is empty
    				return (char*)cszDefault;
    			}
    			if(szParam[0] == '-') {
    				//Value is next Paramenter key
    				return (char*)cszDefault;
    			}
    			return szParam;
    		} else {
    			return (char*)cszDefault;
    		}
    		return NULL;
    	}
    private: 
    	int inArgs(LPWSTR arg, LPWSTR * lpList) {
    		for(int i=0; i < uNumOfArgs; i++) {
    			if(wcsicmp(lpList[i], arg) == 0) {
    				return i;
    			}
    		}
    		return 0;
    	}
    };
    

    UGSCP_Process.h

    #include <windows.h>
    #include <shellapi.h>
    
    void StartProcess(const char * cszFile, const char * cszPath) {
    	STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );
    
    	char * szFilePath = new char[2024];
    	strcpy(szFilePath, cszFile);
    
    	LPWSTR lpFile = new WCHAR[2024];
    	mbstowcs(lpFile, cszFile, 2024);
    
    	LPCWSTR lpPath = new WCHAR[2024];
    	mbstowcs((LPWSTR)lpPath, cszPath, 2024);
    
    	if( !CreateProcessW(NULL, lpFile, NULL, NULL, TRUE, 0, NULL, (LPWSTR)lpPath, &si, &pi )) {
    		printf("[0]=>0;\n");
    	} else {
    		if(pi.hProcess) {
    			WaitForSingleObject(pi.hProcess, 0);
    			printf("[0]=>%u;\n", pi.dwProcessId);
    		} else {
    			printf("[0]=>0;\n");
    		}
    	}
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    }
    
    void IsRunning(DWORD hProcess) {
    	HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hProcess);
    	if(hHandle) {
    		printf("[0]=>1;\n");
    	} else {
    		printf("[0]=>0;\n");
    	}
    	CloseHandle(hHandle);
    }
    
    void StopProcess(DWORD hProcess) {
    	HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hProcess);
    	if(TerminateProcess(hHandle, 0)) {
    		printf("[0]=>1;\n");
    	} else {
    		printf("[0]=>0;\n");
    	}
    	CloseHandle(hHandle);
    }
    

    UGSCP_Win.cpp

    // UGSCP_Win.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "CommandLine.h"
    #include <windows.h>
    #include <shellapi.h>
    #include "UGSCP_Process.h"
    static CCommandLine* Cmd;
    
    void usagehelp(void) {
    	printf("\n UGSCP.exe -c [command] [options]\n");
    	printf("  -f    Path to File\n");
    	printf("  -w    Path to be executed in\n");
    	printf("  -p    Process ID\n");
    	printf("  -c    Command [start | stop | info]\n\n");
    	printf(" Example: UGSCP.exe -c start -f \"C:\\Path\\game.exe\" -w \"C:\\Working\\Directory\"\n");
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char * szAction;
    	Cmd = new CCommandLine();
    	Cmd->LoadCommandLine(GetCommandLineW());
    	szAction = Cmd->FindParam(L"-c", NULL);
    	if(szAction) {
    		if(strcmp(szAction, "start") == 0) {
    			//Start Process
    			char * szFile = Cmd->FindParam(L"-f", NULL);
    			char * szPath = Cmd->FindParam(L"-w", NULL);
    			if(szFile && szPath) {
    				StartProcess(szFile, szPath);
    			} else {
    				usagehelp();
    			}
    		} else if(strcmp(szAction, "info") == 0) {
    			char * szID = Cmd->FindParam(L"-p", NULL);
    			if(szID) {
    				IsRunning(atof(szID));
    			} else {
    				usagehelp();
    			}
    		} else if(strcmp(szAction, "stop") == 0) {
    			char * szID = Cmd->FindParam(L"-p", NULL);
    			if(szID) {
    				StopProcess(atof(szID));
    			} else {
    				usagehelp();
    			}
    		} else {
    			usagehelp();
    		}
    	} else {
    		usagehelp();
    	}
    	//while(true) {}
    	return 0;
    }
    

    Am besten wäre es natürlich wen mir einer diesen Code in Linux kompilieren kann. Und noch eine zwischenfrage: Ist es möglich das die Linux Binary auf jeden Linux OS läuft?

    Danke im vorraus!!!! 😃



  • Ich hoff du erwartest nicht dass das jemand jetzt einfach für dich schreibt?

    Neue Prozesse erstellst du mittels fork() (in unistd.h zu finden).
    Anstatt FindParam() würd ich in Linux einfach getopt() verwenden
    (ebenfalls in unistd.h)
    Prozesse stoppen kannst du über Signale mittels der Funktion kill()
    Und ja deine Binary sollte theoretisch auf jedem Linux laufen.



  • danke für die info aber ich habe kein linux wo ich es machen könnte



  • Nimm bochs.

    greetz, Swordfish



  • Kenn ich schon danke aber ich kann mit 56k keine Linux OS ziehen.



  • heft cd / freunde sollten da abhilfe schaffen ...



  • Vll. ist auch cygwin was für dich.
    http://www.cygwin.com/



  • Das bringt mir alles nicht meine freunde sind nicht so auf PC wie ich. Auserdem wüsste ich jetzt nicht wo ich so eine CD auftreiben soll. Muss ich extra 4km fahren um son heft zu kaufen. Kann mir das niemand kompilieren?



  • Ich könnt schon nur, frag ich mich was du mit net binary willst
    wenn du garkein linux hast?



  • Was meinst du wieso ich bei Projekte poste?

    Ich schreib gerade eine Automatisierung von Server Installationen dafür brauch eine Win/Linux binary die mir die PID gibt wie mein Tool das macht.

    PHP schliesst ein Prozess nachdem das Script fertig ist. Durch ein weiteres Tool schliesst PHP nur das Tool aber nicht den geöffneten Prozess. Und PHP zeigt noch ein problem auf. ProcOpen ist ein Resource type welchen man nicht speichern kann oder auch lesen.

    Ja und weil es für Windows & Linux funktionieren soll sind halt 2 binarys nötig?

    Edit:
    Windows version ist schon fast fertig: http://ihost-images.biz/i/UGSCP.JPG



  • Kurzum: Du willst ein Programm, dass du selber nicht programmieren kannst, kompiliert haben, obwohl du es selber nicht kompilieren kannst?

    Das ist dann wohl ein Fall für einen Auftragsprogrammierer. Aber frag lieber nicht nach Stundenlohn.

    (Sorry für den rauen Ton, aber umsonst arbeiten wird hier wohl niemand ;))



  • árn[y]ék schrieb:

    Kurzum: Du willst ein Programm, dass du selber nicht programmieren kannst, kompiliert haben, obwohl du es selber nicht kompilieren kannst?

    Das ist dann wohl ein Fall für einen Auftragsprogrammierer. Aber frag lieber nicht nach Stundenlohn.

    (Sorry für den rauen Ton, aber umsonst arbeiten wird hier wohl niemand ;))

    Naja ich hätte es umsonst gemacht wen es nicht mehr wäre als den code ein wenig umzuschreiben. Naja ich werde mir jetzt die ISO saugen mir egal wie lange das dauert, hier gibts ja nix.



  • Dalmonit schrieb:

    Naja ich hätte es umsonst gemacht wen es nicht mehr wäre als den code ein wenig umzuschreiben. Naja ich werde mir jetzt die ISO saugen mir egal wie lange das dauert, hier gibts ja nix.

    a) Den Code müsste man grob verändern.
    b) Linux Images sind auch per Post bestellbar (entweder for free oder gegen ein paar Euro!)
    c) Hier gibts ja nix??? Schreibe den Code selber "ein wenig" um und ich kompiliere ihn dir.



  • Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Dalmonit schrieb:

    Naja ich hätte es umsonst gemacht wen es nicht mehr wäre als den code ein wenig umzuschreiben.

    dein code ist so sehr mit der winapi verflochten, dass der wiederverwertungswert für ne linux variante richtung null tendieren dürfte. d.h. für linux muss das gesamte programm komplett neu geschrieben werden.



  • So etwas wird generell mit einem Script gemacht und nicht mit einer Binary.
    Du solltest also eindeuting die Finger davon lassen, außerdem gibts schon genügend Webinterfaces für Gameserver. PUNKT!

    MfG
    Der(Besser)Wissende



  • https://shipit.ubuntu.com/ kost keinen cent, einfach eine cd bestellen installieren und dann kanns losgehen.


Anmelden zum Antworten