Wie Software korrekt verteilen? (C++: Windows, Java: Windows & Linux)



  • Hi,
    Ich habe ein Problem mit zwei Stücken Software, die ich veröffentlichen möchte und die sich dabei gut in die Betriebssysteme installieren sollen.
    Eines ist in C++ geschrieben, das andere in Java, ein Problem besteht allerdings mit der korrekten Verteilung insbesondere was die richtigen Ordner angeht.
    In C++ unter Linux ist es einfach, dort bieten mir die Gnu Autotools alle nötige Funktionalität, ich kriege einen Header mit den Prefixdaten etc. und habe dadurch alle Verzeichnisse, die ich brauche und weiß wo mein Kram sich hininstalliert hat.
    Problematischer sieht es bei C++ Programmen unter Windows aus, dort sind Sourcedistributionen eher unüblich und ich will eine Binary mit NSIS Installer verteilen.
    Auch unter Windows brauche ich natürlich die Verzeichnisse und ich will natürlich nicht auf das Verzeichnis der Executable zugreifen(zumindest nicht schreibend, gibt es auch beim lesenden Zugriff Probleme?). Einen Header wie config.h mit den Autotools kann ich also hier nicht haben, ich muss es zur Laufzeit irgendwo auslesen, mir fallen mehrere Möglichkeiten ein, aber ich will die Üblichste verwenden. Wie macht man das üblicherweise?
    Noch größere Probleme habe ich bei dem Javaprogramm, sowohl unter Linux als auch unter Windows habe ich dort keine Ahnung wie ich an den Ordner rankomme in dem meine Dateien installiert wurden, wie mache ich das mit Java?



  • Unter Windows ist's eigentlich recht einfach: Im Programmverzeichnis liegen die Binaries und so (ja, im Programmverzeichnis darfst du Lesen), Nutzer-spezifisches Zeug legst du im AppData-Pfad ab (siehe MSDN zu SHGetFolderPath und CSIDL_APPDATA).

    SHGetFolderPath mit CSIDL_APPDATA gibt unter Vista z.B. "C:\Users\Bla\AppData\Roaming" zurück. Da hängst du dann deinen Softwarenamen dran und hast dein Verzeichnis (also speicherst "options.xml" z.B. in "C:\Users\Bla\AppData\Roaming\CoolSoftware\options.xml").

    Siehe auch: http://www.computerperformance.co.uk/vista/vista_appdata.htm

    Hätte aber gerne auch noch eine Bestätigung von einem anderen Nutzer, ob das so korrekt ist.



  • Die ganzen Konstanten für die Pfade sind hier zu finden:
    http://msdn.microsoft.com/de-de/library/bb762494.aspx

    Wenn man sein Programm von einem professionellen Installer installieren lässt, sollte man sich darüber keine großen Gedanken machen müssen, wo was hin installiert wird. Wenn dann die eigene Applikation läuft, und man z.B. Dateien aus dem eigenen Applikations-Pfad lädt, ist das doch meistens der relative Pfad.

    Will man User-Einstellungen speichern, kann man das in der Registry oder im entsprechenden Pfad tun. Die wichtigsten Pfade sind wohl die hier:

    CSIDL_LOCAL_APPDATA (0x001c)
    Version 5.0. The file system directory that serves as a data repository for local (nonroaming) applications. A typical path is C:\Documents and Settings\username\Local Settings\Application Data.

    CSIDL_MYDOCUMENTS (0x000c)
    Version 6.0. The virtual folder representing the My Documents desktop item.

    CSIDL_MYMUSIC (0x000d)
    The file system directory that serves as a common repository for music files. A typical path is C:\Documents and Settings\User\My Documents\My Music.

    CSIDL_MYPICTURES (0x0027)
    Version 5.0. The file system directory that serves as a common repository for image files. A typical path is C:\Documents and Settings\username\My Documents\My Pictures.

    Aber am besten den Link von oben einfach mal durch schauen.



  • Naja, okay, ich denke ich hab eine Idee für nativ unter Windows, aber wie mache ich das mit Java?



  • JustAnotherNoob schrieb:

    Naja, okay, ich denke ich hab eine Idee für nativ unter Windows, aber wie mache ich das mit Java?

    Du könntest eine .jar erstellen in der nicht nur das Programm sondern auch die Daten liegen. Dann ist es total egal wo diese ist. Du musst dann nur getResourceAsStream benutzen zum lesen der Dateien. Das ist z.B. unter http://openbook.galileocomputing.de/javainsel8/javainsel_14_004.htm#mj7ea5445d56ac0a08cd42996a0f1e93c3 erklärt.



  • Tobiking2 schrieb:

    Du könntest eine .jar erstellen in der nicht nur das Programm sondern auch die Daten liegen. Dann ist es total egal wo diese ist.

    Und was ist mit Schreibrechten?



  • Badestrand schrieb:

    Und was ist mit Schreibrechten?

    Oh, da hab ich grad gar nicht dran gedacht. So einfach bekommt man keinen Schreibzugriff auf Dateien in der jar. Man kann da höchstens direkt über jar/zip funktionen dran.


  • Administrator

    JustAnotherNoob schrieb:

    ..., aber wie mache ich das mit Java?

    Gibt verschiedene Möglichkeiten. Ich persönlich mag kleine Startup Progrämmchen, welche die nötigen Daten an das Java Programm per Commandparameter übergeben. Eine ganz einfache Möglichkeit:
    Lass von deinem Installationsprogramm eine Verknüpfung erstellen, welche wie folgt aussieht:
    - Working Directory: <Der Installationspfad>
    - Kommando: javaw pfadzudeinem.jar "%APPDATA%"
    (%APPDATA% wird von Windows entsprechend aufgelöst, in den Anwendungsdaten Ordner des Benutzers auf dem aktuellen System, bzw. der Anwendungsdaten Ordner vom Benutzer, welcher auf die Verknüpfung geklickt hat.)

    Dank der Verknüpfung kannst du dann sogar ein eigenes Icon auswählen 😉

    Grüssli



  • schöne Idee, ich hatte mir schon überlegt, das über einen starter zu regeln, aber irgendwie war ich so blöd und bin nicht auf die Kommandozeilenparameter gekommen und fand andere Lösungen zu umständlich ..


Anmelden zum Antworten