!! 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 IPerApplicationSettingsVorteile:
- 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üsselnamenImplementierung:
#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.
-