relativer pfad zu einer datei im programmverzeichnis



  • Hallo,

    ich erstelle in Visual C++ ein Programm aus dem ich eine weitere .exe Datei öffnen kann.
    Die zweite .exe Datei liegt ebenfalls im Programm-Installationsverzeichnis-Ordner.
    Die von mir verwendete Anweisung :

    case IDM_INSTRUKTION:  
                LaunchBrowser(_TR("instruktion.exe"));    
            break;
    

    funktioniert leider unter bestimmten Umständen nicht.
    Nun braeuchte ich eine Anweisung die immer auf den relativen-Installationsverzeichnis-Ordner verweist....

    Ich habe zwar folgende Information gefunden

    Mit GetCommandLine bekommst du den kompletten Pfad und kannst Dir das Verzeichnis vorne abschneiden.

    weiss aber leider nicht wie ich den Hinweis verwenden soll .....

    Verwende ich ihn so:

    case IDM_INSTRUKTION: 
       LaunchBrowser(_TR (System.Environment.CurrentDirectory instruktion.exe));
    break;
    

    erhalte ich sehr viele Fehlermeldungen z.B. System.Environment ist kein deklarierter Bezeichner ....

    Leider habe ich überhaupt keine Ahnung von C++ wodurch es mir nicht möglich ist, selbst eine Lösung finden zu können. Ich habe auch in den Forumsregeln gelesen, dass ich mich ernsthaft mit dem Thema auseinandersetzen soll, bevor ich um Hilfe bitte, das habe ich getan und finde dennoch keine Lösung

    Vielleicht möchte mir ja jemand helfen?

    Ich wäre sehr froh, danke Gruss Anna.



  • Hallo,

    verwendest du irgendein Framework? TR_(), LaunchBrowser(), IDM_* sieht nicht nach Standard C++ aus.

    Der einfachste Weg ist sicher:
    1. Bei Programmstart wechselst du das Arbeitsverzeichnis deiner Anwendung (CWD / current working directory) in das Verzeichnis deiner .exe
    -> Google nach C++, Windows, Verzeichnis der .EXE ermitteln
    -> Google nach C++, Windows, change working directory
    2. Jetzt funktionieren deine relativen Pfade 🙂



  • Du schreibst kein C++ Programm. Das ist C++/CLI, eine andere Sprache.



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum C++/CLI mit .NET verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,
    danke für eure Antworten.

    @C++-Entwickler

    verwendest du irgendein Framework? TR_(), LaunchBrowser(), IDM_* sieht nicht nach Standard C++ aus.

    ich weiss es nicht 🙄, ich verwende visual c++ 2010 und die Arbeitsmappe für meine Anwendung wurde mir von Freunden zur Verfügung gestellt.

    Ich denke dein Bezug:

    1. Bei Programmstart wechselst du das Arbeitsverzeichnis deiner Anwendung (CWD / current working directory) in das Verzeichnis deiner .exe

    hat glaube ich nichts mit meinem Problem zu tun, aber vielleicht verstehe ich es auch falsch .... ?

    Also das Programm das ich erstelle wird normal in den Ordner C:programme\meinprogramm installiert. Wird das Programm gestartet (man kann damit Formulare lesen) kann man über einen Meülink

    case IDM_INSTRUKTION:  
                LaunchBrowser(_TR("instruktion.exe"));    
            break;
    

    als Informationszusatz, die instruktion.exe auslösen. Das funktioniert immer.
    Wird aber das Programm gestartet und ein Formular geöffnet, dann wird die instruktion.exe nicht mehr im Verzeichnis C:programme\meinprogramm gesucht, sondern im Verzeichnis indem das eingelesene Formular sich befindet. (kompliziert ?)

    @manni66

    Du schreibst kein C++ Programm. Das ist C++/CLI, eine andere Sprache.

    ... dann bin ich wohl auch noch im falschen Forum?



  • Kommt drauf an, was deine Absicht ist. Willst du C++ oder C++/CLI programmieren?



  • Kommt drauf an, was deine Absicht ist. Willst du C++ oder C++/CLI programmieren?

    Eigentlich würde ich gerne nur den verwendeten Code :

    case IDM_INSTRUKTION:  
                LaunchBrowser(_TR("instruktion.exe"));    
            break;
    

    soweit veränern, daß auf die einzulesende "instruktion.exe" die im Instalationsordner des MutterProgramms relativ zum Instalationsordner verwiesen wird.
    Da ich den unterschied zwischen C++ und C++/CLI kann ich nicht sagen was ich programmieren muss.



  • Tja, die Zeilen könnten sogar C sein. Du musst wissen/entscheiden, in welcher Sprache du programmierst.

    Wenn "System." im Programm vorkommt, ist es ein Hinweis auf CLI (es sei denn, System stammt von dir).

    Zu LaunchBrowser finde ich spontan auch nur Hinweise auf .NET (spricht CLI), was aber nicht heißt, dass es nicht auch eine C++ Funktion mit diesem Namen geben könnte.



  • Ich gehe davon aus, dass deine Applikation *eigentlich* in C++ und zusammen mit irgendeinem Framework wie MFC o. ä. geschrieben ist.

    System.Environment.CurrentDirectory ist allerdings klar C# - dieser Code, da .NET, kann allerdings genau so gut in C++/CLI verwendet werden, weil dies auch eine .NET Sprache ist - natürlich mit entsprechender Syntax.

    ABER... ich empfehle dir bei C++ zu bleiben und die .NET Welt aussen vor zu lassen oder aber ganz auf .NET mit C# umzustellen. Von C++/CLI ist abzuraten - besonders in deinem Kontext, wo es nicht um Interoperabilität zwischen der nativen- und managed Welt geht.

    Hier ein Code-Stück, mit dem du es versuchen könntest:

    #include <Windows.h>
    #include <Shlwapi.h>
    #include <tchar.h>
    
    #include <system_error>
    
    #pragma comment (lib, "Shlwapi.lib")
    
    // ...
    
    case IDM_INSTRUKTION:
    {
        TCHAR path[MAX_PATH] = {};
        DWORD result = GetModuleFileName(NULL, path, sizeof(path) / sizeof(path[0]));
        if (result == 0)
        {
            std::error_code ec(GetLastError(), std::system_category());
            throw std::system_error(ec);
        }
        PathRemoveFileSpec(path);
        TCHAR newPath[MAX_PATH] = {};
        PathCombine(newPath, path, _T("instruktion.exe"));
        LaunchBrowser(newPath);
    
        break;
    }
    

    Kommentare:
    * Ich vermute _TR(..) ist ein Makro mit ähnlicher Funktion wie _T(..) um Wide- und nicht Wide Literale zu unterstützen.
    * Dieser Code setzt std::error_code bzw. std::system_error und damit C++11 voraus - falls das nicht vorhanden ist, einfach den Code entsprechend anpassen und z. B. eine eigene Exception werfen.

    • pragma comment (lib...) dient zum Linken der entsprechenden Library - selbstverständlich kann das auch über die Projekt-Einstellung erreicht werden.
      * Falls es beim Bauen Probleme gibt, bitte die Fehlermeldungen mit dem entsprechenden Code-Ausschnitt 1:1 (=Copy/Paste!) hier zeigen.


  • @manni66

    Wenn "System." im Programm vorkommt, ist es ein Hinweis auf CLI (es sei denn, System stammt von dir).

    ... ja "System" kommt vor ...

    @theta, danke auch für deine Antwort...

    Hier ein Code-Stück, mit dem du es versuchen könntest:

    ... hab ich versucht, kommen aber leider unzählige Fehlermeldungen, z.B. .:

    1>C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\ws2def.h(91): error C2220: Warnung wird als Fehler interpretiert, es wurde keine object-Datei generiert.
    C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\winsock.h(306): Siehe vorherige Definition von 'INADDR_BROADCAST'
    1>src\Konvergent.cpp(475): error C2065: 'HTREEITEM': nichtdeklarierter Bezeichner
    1>src\Konvergent.cpp(476): error C2065: 'hRoot': nichtdeklarierter Bezeichner
    1>src\Konvergent.cpp(477): error C2065: 'hRoot': nichtdeklarierter Bezeichner
    ... und so weiter ...

    ... bin ich bin damit überfordert ... (habe nicht geglaubt daß das so konpliziert ist .... 🙂 )



  • Hast du die Probleme erst seit du den Code im case IDM_INSTRUKTION: und die Includes eingefügt hast?

    Es könnte ein Problem mit der Reihenfolge der Includes sein ( Winsock.h / Winsock2.h und Windows.h vertragen sich nicht immer so gut). Versuche mal #define WIN32_LEAN_AND_MEAN in der Zeile über #include <Windows.h> einzufügen.

    Ansonsten zeige mal den Code von Konvergent.cpp ...



  • ... mit

    Versuche mal [c]#define WIN32_LEAN_AND_MEAN

    ... 🙂 genial, mit #define WIN32_LEAN_AND_MEAN läufts durch .... unglaublich ...
    vielen herzlichen Dank, theta, viel Stress weniger, du hast mir sehr geheolfen,

    danke, Gruss Anna.


Anmelden zum Antworten