CreateProcess() mit Variabler aus Textfile



  • Sorry, Leute, ich will euch nicht auf den Zeiger gehen mit meinem Zeugs hier.

    Ich habe als mal mit GetLastError() den Debugger laufen lassen...

    Das ist die Fehlermeldung:
    ODS: CreateProcess failed (2).

    Leider kann ich mit dieser Fehlermeldung nix anfangen... 😕

    Auch der Versuch, mit:

    size_t len = but[0].link;
    if(len && but[0].link[len-1]=='\n')
      but[0].link[len-1] = 0;
    

    den Zeilenumbruch weg zu bekommen scheitert bei mir.

    error #2066: Illegal use of type name 'size_t'.

    😕 😕 😕



  • Dann nimm statt:

    size_t len = but[0].link;
    

    dies hier:

    int len = strlen(but[0].link);
    


  • Danke für den Tipp.

    Hatte ich schon probiert:

    int len = 0;
    
    typedef struct button Button;
    struct button
    	{
       	int nr;
      	wchar_t text[LINELEN_MAX+1];
            wchar_t link[LINELEN_MAX+1];
    	};
    /* hier kommen nur die 
    Klassenbezeichnung usw
    */
    
    static  INT_PTR CALLBACK MainDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        int n = 3,																	// Anzahl der zu einem Datensatz zugehörigen Zeilen.
            i = 0;				 													// Index und Zähler fürs Strukturarray.
        char* fname = "My Flash disk\\navigation\\skin480x272\\Addins\\Addins.txt";		// Textdatei
    		wchar_t  *fmtw = (L"%d %300l[^\n]\n %300l[^\n]\n");						// Angepasst an LINELEN_MAX.
    
        FILE* fp = fopen ( fname, "r" );
    	Button buttons[N] = {0}; 													// Strukturarray für die Daten der Buttons.
    
    	if ( fp == NULL )															//
    		{
    		MessageBox(NULL, L"Addins.TXT fehlt!", L"Addins-Menü", MB_SETFOREGROUND);
    		return (0);
    		}
        while ( !feof(fp) ) 
    	{
            if ( i == N ) 
    		{
    		MessageBox(NULL, L"Addins.TXT beschädigt! ", L"Addins-Menu", MB_SETFOREGROUND);
    		return (0);
                	break;
            	}
    		if (n != fwscanf(fp, fmtw, &buttons[i].nr, buttons[i].text, buttons[i].link))
    			{
    	  		MessageBox(NULL, L"Addins.TXT nicht vollständig! ", L"Addins-Menu", MB_SETFOREGROUND);
    			return (0);
                		break;
     			}
    
    			len = buttons[i].link;
    			if(len && buttons[i].link[len-1]=='\n')
      			buttons[i].link[len-1] = 0; 
    		i++;
        	}
        fclose ( fp );
    

    Da bekomme ich dann eine Fehlermeldung beim kompilieren:
    Operands of = have incompatible types 'int' and 'wchar_t *'.

    Ich krieg das einfach nicht gebacken... vielleicht bin ich einfach zu blööd dafür?!? 😕



  • Autsch, ich habe tatsächlich wcslen vergessen (im vorigen Post editiert).



  • Da bekomme ich dann eine Fehlermeldung beim kompilieren:
    Operands of = have incompatible types 'int' and 'wchar_t *'.

    Ist ja klar..
    Guck mal was du hier gemacht hast:

    int len = 0;
    
    struct button
        {
           int nr;
          wchar_t text[LINELEN_MAX+1];
            wchar_t link[LINELEN_MAX+1];
        };
    

    und dann:

    len = buttons[i].link;
    

    Du nimmst ein int und weist ihm ein w_char zu?

    Was wäre denn mit:

    len = wcslen(buttons[i].link);
    

    Das sollte wohl besser funktionieren und ist auch Sinn dieser Zuweisung.
    Denn du möchtest ja in len die Länge des w_char buttons[i].link speichern.

    Gruß,
    DC



  • Vicious Falcon schrieb:

    int len = wcslen(but[0].link);
    if(len && but[0].link[len-1]=='\n')
      but[0].link[len-1] = 0;
    

    so kompiliert das Script zwar, aber im Debugger ist immer noch Fehler 2 zu finden und die Proggies starten nicht... ausser dem Explorer... und das versteh ich überhaupt nicht...
    Hier mal die Fehlersuche:

    Stelle Remoteverbindung her
    Starte remote-debug Server
    Erstelle remote Prozess Addins-Menu.exe
    Prozess 837014E gestartet
    Thread 83B01AE gestartet
    Lade Addins-Menu.exe in 00010000
    Lade coredll.dll in 40010000
    ODS: CreateProcess failed (2).
    
    Thread 83B01AE mit 0 beendet
    Prozess 837014E mit 1 beendet
    Stoppe remote-debug Server
    Schließe Remoteverbindung
    Fertig
    

    ODS: CreateProcess failed (2) kommt, wennich einen der Buttons klicke, ausser wenn ich den Explorer-Button anklicke...

    Vicious Falcon schrieb:

    Edit: Du hast den Pfad nicht mehr

    \\My Flash Disk\\navigation\\mnavdce.exe\0

    so in der Datei stehen, oder? "\0" sind zwei verschiedene Zeichen und keinesfalls die von dir (vielleicht) angestrebte Nullterminierung.

    Nein, meine Textdatei sieht so aus:

    1
    GoPal starten
    \\My Flash Disk\\navigation\\Skin480x272\\Addins\\gopal_start.exe
    
    2
    Temp/ Test
    \\Temp\\TCPMP-Starter.exe
    
    3
    Program Files Test
    \\Program Files\\TCPMP-Starter.exe
    
    4
    Windows\Test Ordner
    \\Windows\\Test Ordner\\TCPMP-Starter.exe
    
    5
    Windows\Test Ordner\Neuer Ordner
    \\Windows\\Test Ordner\\Neuer Ordner\\TCPMP-Starter.exe
    
    6
    Windows
    \\Windows\\TCPMP-Starter.exe
    
    7
    Explorer
    \\Windows\\Explorer.exe
    
    8
    Test8
    \\My Flash Disk\\test.exe
    


  • 💡 Ich habs selbst gefunden... 😃

    Vorab: Bis jetzt habe ich noch keine Ahnung, warum ausgerechnet der Explorer gestartet wurde und der Rest nicht, aber das ist mir erst mal vollkommen wurscht.

    Lösung:

    Die Pfade im Textfile dürfen KEINE Backslashs vorab haben, also:
    \\Storage Card\\Programme\\Testprogramm\\Test.exe

    Der korrekte Pfad sieht so aus:
    Storage Card\\Programme\\Testprogramm\\Test.exe

    Ausserdem benötige ich das wcslen() nicht. Der Pfad aus dem Textfile wird auch ohne diesen sauber ausgelesen und übergeben.

    Dann klappt das auch mit der Nachbarin... 🤡 😋

    Ich hab schon wirklich arg an mir gezweifelt. Es ist zwar das erste Mal, dass ich Variablen aus einem Textfile auslese, da ich bisher lediglich mit INIs gearbeitet hatte... aber nu rockt das Ding. 🤡

    Nochmals vielen Dank an alle, die mir hier mit Rat und Tat zur Seite stehen. Ich habe schon sehr viel von Euch gelernt 👍
    ...und wollte euch wirklich nicht nerven mit meiner Unwissenheit. 😉


  • Mod

    Warum hast Du überhaupt doppelte Backslashes? Die benötigst Du doch nur im C++ Quellcode. Aber nicht bei der Verwendung in Deiner Textdatei!



  • Martin Richter schrieb:

    Warum hast Du überhaupt doppelte Backslashes? Die benötigst Du doch nur im C++ Quellcode. Aber nicht bei der Verwendung in Deiner Textdatei!

    Danke 👍 Das wusste ich nicht...
    So ist das für den User auch einfacher zu editieren, wenn er sich da andere Programme in das Textfile eintragen möchte.

    Wo ich gerade dabei bin...
    Kann ich das azuslesen der Textdatei so beeinflussen, dass Kommentar-Zeilen nicht mit eingelesen werden? Und wenn ja.... wie kann ich das machen?


  • Mod

    Prüfe auf das Zeichen, dass bei Dir ein Kommentarzeichen sein soll und ignoriere die Zeile... Wo ist das Problem?


Anmelden zum Antworten