!! ApplicationSettings Version 1.0 !!



  • Da es immer wieder Probleme mit Registry/Ini und demnächst auch XML geben wird, habe ich mich mal daran gemacht, eine einfache Schnittstelle für zu speichernde Einstellungen zu schreiben. Das Objekt soll in MFC genauso wie in WTL, Delphi oder VB erstellbar sein.
    Ergebnis: Das COM-Objekt IPerApplicationSettings

    Vorteile:
    - Handhabung sehr einfach
    - Objekt ist ein Singleton-Server, d.h. von jeder Stelle des Programms kann auf die gleichen Einstellungen ohne Kenntnis des Objektzeigers zugegriffen werden
    - automatisierte Erstellung/Löschung von Sektionen/Schlüsseln/Schlüsselnamen

    Implementierung:

    #import "ApplicationSettings\Debug\ApplicationSettings.dll" no_namespace raw_interfaces_only
    
    // Objekt erstellen
    IPerApplicationSettingsPtr spAppSettings;
    spAppSettings.CreateInstance( __uuidof(PerApplicationSettings));
    
    // Format setzen (geschieht nur 1x beim Starten des Programms)
    spAppSettings->SetDestinationFormat( DF_XML);
    
    // Ziel setzen (für Registry ein Schlüsselstring) (nur beim Starten notwendig)
    _bstr_t file( _T("myInit.xml"));
    spAppSettings->put_Destination( file);
    
    // Laden der Einstellungen
    spAppSettings->Load();
    
    // Testeintrag erstellen
    _bstr_t bstr1( _T("testSection")), bstr2( _T("testValueName1"));
    _variant_t varValue( (UINT)5);
    
    //  so liest man eine Einstellung
    spAppSettings->GetValue( bstr1, bstr2, &varValue);
    
    // so schreibt man eine Einstellung
    spAppSettings->put_Value( bstr1, bstr2, varValue);
    
    // Datei speichern (flushen)
    spAppSettings->Save();
    

    Um das Objekt in anderen CPP-Dateien bekannt zu machen, ist folgender Code notwendig:

    #import "ApplicationSettings\Debug\ApplicationSettings.dll" no_namespace raw_interfaces_only
    // Objekt erstellen
    IPerApplicationSettingsPtr spAppSettings;
    // Erstellung gibt immer den Zeiger auf das 'einzige' Element zurück
    spAppSettings.CreateInstance( __uuidof(PerApplicationSettings));
    

    Wenn gewünscht, schickt mir ne Mail, für welche Version [Unicode (WinNT/Win2K)/Multibyte (Win98)] ihr euch interessiert.
    Bedingung: Zusenden gefundener Fehler und Verbesserungsvorschläge !

    Gruss
    René



  • Bitte mir:

    = WInNT

    Email steht im Modforum
    Danke



  • Hm, wo find ich die Mailadi genau, ich finde überall nur:

    "Der Zugriff auf diese eMail-Adresse ist durch die Administration oder den Benutzer gesperrt worden."



  • Mail unterwegs

    danke

    [ Dieser Beitrag wurde am 28.02.2003 um 14:31 Uhr von Unix-Tom editiert. ]



  • Hi,

    kann vielleicht jemand ein kurzes, funktionierendes Beispiel dazu posten? Ich bekomme das irgendwie nicht hin. 🙄

    Zum Beispiel verursacht folgendes Programm einen Absturz. Die DLL habe ich vorher mit regsvr32 registriert.

    #import "C:\ApplicationSettings.dll" no_namespace raw_interfaces_only
    
    #define UNICODE
    #define _UNICODE
    
    #include <windows.h>
    #include <tchar.h>
    
    int main() {
        CoInitialize(NULL);
    
        // Objekt erstellen
        IPerApplicationSettingsPtr spAppSettings;
        spAppSettings.CreateInstance( __uuidof(PerApplicationSettings));
    
        // Format setzen (geschieht nur 1x beim Starten des Programms)
        spAppSettings->SetDestinationFormat(DF_XML);
    
        // Ziel setzen (für Registry ein Schlüsselstring) (nur beim Starten notwendig)
        _bstr_t file( _T("C:\\myInit.xml"));
        spAppSettings->put_Destination(file);
    
        // Testeintrag erstellen
        _bstr_t bstr1( _T("testSection")), bstr2( _T("testValueName1"));
        _variant_t varValue((UINT)5);
    
        // so schreibt man eine Einstellung
        spAppSettings->put_Value(bstr1, bstr2, varValue);
    
        // Datei speichern (flushen)
        spAppSettings->Save();
    
        CoUninitialize();
    
        return 0;
    }
    


  • @Trolli
    Update wurde schon rausgeschickt. Sicherlich ist die DLL noch nicht ohne Fehler, da ich für das Ganze erst knapp 3h Arbeit reingesteckt habe.



  • @Trolli
    P.S.: Es wäre net, dass, wenn Du einen Absturz entdeckst, Du wenigstens die Codezeile angibst, an welcher es passiert !



  • Mir bitte auch mailen...

    Windows 2000 / commander at c-plusplus . de (wegen spamrobots) 😉

    danke



  • Hi!

    Sorry, das ich den Fehler nicht gepostet hatte.

    Ich hatte vergessen Release() vor CoUninitialize() aufrufen. Jetzt funktioniert es einwandfrei. 🙂

    Ein kleiner Verbesserungsvorschlag: Einheitliche Methodennamen. Manchmal hast du das Verb groß, manchmal klein, mal mit Unterstrich, mal ohne. 😉

    Danke!



  • @Trolli
    Du meinst wahrscheinlich SetDestinationFormat! Ok, werde ich ändern. Hatte es initial als Funktion geschrieben sowie alle anderen Befehle auch. Danach habe ich es dann auf get/put-Properties geändert, aber das nicht für SetDestinationFormat->put_DestinationFormat übernommen.



  • Registry-Problem:
    Da in die Registry nur DWORD oder StringZero geschrieben werden können, muss ich auf ein einheitliches Format ausweichen, was die Datentypen double/DATE u.s.w. betrift.

    Ich denke, dass es günstig wäre, für alle Datentypen Reg_Binary zu nehmen, da dann in den ersten 2 Bytes der Typ stehen kann und der Speicherverbrauch in der Registry am geringsten ist.
    Nachteil ist, dass es vom Registry-Editor nicht mehr editiert werden kann!

    Andere Vorschläge bitte jetzt posten!

    Thx



  • Update-Vorschlage "Verbindungspunkte":
    Jedes Objekt, welches Daten liest oder schreibt, kann sich über Verbindungspunkte (Connection Points) mit dem Settings-Objekt verbinden und somit über Änderungen benachrichtigt werden, die ausserhalb an einer bestimmten Eigenschaft vorgenommen wurden. Gut einsetzbar bei komplexen Einstellungsdialogen, in denen die kompletten Anwendungseinstellungen vorgenommen werden können.



  • Hi,

    Bitte mir auch schicken:

    Win2000

    kai.eberitsch@freenet.de

    MFG
    Kai


Anmelden zum Antworten