Dominik Kocuj - strona domowa
Dominik Kocuj - strona domowa
http://dominik.kocuj.pl

Dominik Kocuj - strona domowa
  • 23 Maj 2017

Dominik Kocuj - strona domowa

Dominik Kocuj - strona domowa - prawa,autorskie,format,pliku,ini,kompilacja,instalacja,klasy,opis,użycie
  • Subskrypcja

CDomkoINI (C++)


CDomkoINI - dokumentacja 1.0.0 (213,22 kB)
 
Data utworzenia: 11.04.2012
Data ostatniej modyfikacji: 11.04.2012

Podczas tworzenia programu w języku C++ pojawiła się potrzeba utworzenia pliku z prostymi ustawieniami pewnych wartości. Chciałem oddzielić warstwę aplikacji od warstwy danych i potrzebowałem m.in. informacji o tym który kolor we wczytywanym obrazku jest tłem. Jeżeli wpisałbym to na stałe do programu, to każda zmiana tła obrazka wymagałaby ponownej kompilacji programu.

Najbardziej popularnym obecnie formatem do przechowywania danych jest XML. Jednak sam format jest dość trudny do analizy przez program, a i jego struktura – choć bardzo prosta i przejrzysta – potrafi zajmować sporo bajtów. Przypomniałem sobie o formacie INI. Jest to prosty format plików idealnie nadający się do ustawiania jakichś wartości. Niestety, ciężko znaleźć jakąś sensowną implementację wczytującą i parsującą pliki INI, a te, które znalazłem, dotyczyły języka C. Postanowiłem samemu napisać tą funkcjonalność w C++ – opartą na klasie i metodach oraz innych specyficznych cechach odróżniających C++ od C. W niniejszym artykule prezentuję efekty tego postanowienia oraz gotową klasę do ściągnięcia i ewentualnego wykorzystania we własnych projektach.



1. Prawa autorskie

Klasa Domko INI
Copyright © 2012 Dominik Kocuj

Niniejsza biblioteka jest darmowym oprogramowaniem; możesz ją dystrybuować i/lub modyfikować zgodnie z warunkami licencji LGPL, która jest publikowana przez Free Software Foundation, zarówno w wersji 3 lub (do wyboru) w późniejszej wersji.

Biblioteka ta jest dystrybuowana w nadziei, że będzie użyteczna, ale BEZ JAKIEJKOLWIEK GWARANCJI; nawet bez domyślnej gwarancji PRZYDATNOŚCI lub PRZYDATNOŚCI DO OKREŚLONEGO CELU. Zapoznaj się z licencją LGPL w celu uzyskania szczegółów.

Powinieneś otrzymać kopię licencji LGPL wraz z tym programem. Jeżeli nie, możesz ją znaleźć pod adresem http://www.gnu.org/licenses/.



2. Format pliku INI

Zanim przejdę do praktycznej realizacji algorytmu, trzeba zrozumieć czym charakteryzuje się format INI. To prosty format plików, który dzieli się na sekcje i pary – klucz i wartość. Zawartość przykładowego pliku INI może wyglądać np. tak:

; test pliku INI
[person]
firstname=Dominik
lastname=Kocuj

[address]
web=http://dominik.kocuj.pl


W pierwszej linii znajduje się komentarz. Zaczyna się go od średnika („;”), choć zdarzają się też specyfikacje, w których można używać również znaku hash („#”). Cała linia tak rozpoczęta staje się komentarzem i można tu umieścić cokolwiek, a i tak nie będzie to brane pod uwagę przez program.

Przykładowy plik zawiera dwie sekcje – „person” i „address”. Jak widać, sekcje podaje się w nawiasach kwadratowych („[„, „]”) i w linii z taką definicją nie znajduje się już nic innego.

Najważniejszymi elementami są pary – klucz i wartość. To one definiują wartości, które odczytywane są z pliku INI. W przykładowym pliku znajdują się trzy takie pary o nazwach: „firstname”, „lastname” i „web”. Po znaku równości („=”) podaje się wartość danego klucza. Ważne jest, aby pamiętać, że klucze znajdują się w danej sekcji, a więc klucze „firstname” i „lastname” należą do sekcji „person”, a „web” do sekcji „address”. Gdybyśmy dodali klucz „firstname” do sekcji „address” byłby on innym kluczem niż ten w sekcji „person”. Można powiedzieć, że nazwa sekcji i klucza jednoznacznie wyznacza pobieraną wartość.

Niestety, specyfikacja formatu INI po prostu nie istnieje. Z tego powodu każdy nieco inaczej interpretuje pewne rzeczy w tych plikach. Przykładowo, nie wiadomo co robić, gdy istnieją dwie identycznie nazwane sekcje lub wartości w obrębie jednej sekcji, o tej samej nazwie. Niektóre implementacje uznają to za błąd, inne dokonują łączenia tak otrzymanych danych.



3. Kompilacja i instalacja klasy

Klasa CDomkoINI i przykładowy program mogą być używane pod kontrolą systemów Windows i Linux. Możliwe, że klasa ta działa również w innych systemach operacyjnych, jednak nie została tam przetestowana.

Klasę można dołączać do własnych programów bezpośrednio – poprzez skopiowanie pliku cdomkoini.cpp i wszystkich plików *.h do katalogu z programem, który ma jej używać, a następnie dołączenie do kompilacji pliku cdomkoini.cpp. Jest to zrealizowane w przykładowym programie (plik example.cpp).

Drugim sposobem jest zainstalowanie klasy w używanym środowisku programistycznym i skompilowanie pliku cdomkoini.cpp. Następnie plik cdomkoini.o, który jest wynikiem tej operacji, należy umieścić w katalogu z bibliotekami do linkowania przez linker. Ten sposób można zrealizować bardzo prosto w systemie Linux. Wystarczy skompilować i zainstalować klasę i przykładowy program, a wszystkie pliki zostaną umieszczone we właściwych katalogach w systemie. Kompilację przeprowadzić należy poleceniami:

./autogen.sh
./configure
make
make install


Bardziej skomplikowane jest to w systemie Windows. Należy uruchomić środowisko programistyczne (w katalogu src znajdują się podkatalogi z gotowymi projektami dla Microsoft Visual C++ Express 2010 i MinGW Developer Studio) i dokonać kompilacji. Następnie trzeba skopiować wszystkie pliki *.h do katalogu z plikami nagłówkowymi (najczęściej jest to include) i plik cdomkoini.o do katalogu z bibliotekami (najczęściej jest to lib). Od tego momentu można używać klasy we własnych programach.



4. Opis klasy

Klasa CDomkoINI zawiera założenia opisane w rozdziale 2. Obudowana została też obsługą błędów i możliwością modyfikacji jej zachowania oraz może być dołączana do własnych projektów w prosty sposób.

W obecnej postaci klasa realizuje możliwość wczytywania i zapisywania plików INI oraz ich tworzenia i edycji (dodawania sekcji i kluczy z wartościami). Wielkość znaków w nazwach sekcji i kluczy nie ma znaczenia – duże litery zawsze są zamieniane na małe, co szczególnie widać przy korzystaniu z zapisywania do pliku, np. klucz o nazwie „SomeKey” będzie zamieniony na „somekey”. Domyślnie klasa nie pozwala na wielokrotne występowanie sekcji o tych samych nazwach lub tak samo nazwanych kluczy wewnątrz jednej sekcji, jednak istnieje możliwość zmiany tego zachowania. Obsługiwane są też komentarze ze znakiem średnika („;”) – można również pozwolić na wykorzystanie znaku hash („#”).

Wewnątrz klasy znajduje się wiele metod publicznych do wykorzystania przez program, które zostały opisane w tabeli 4.1.

Tabela 4.1: Metody publiczne

metodaopis
CDomkoINI()konstruktor klasy; po jego użyciu dane pliku INI są puste i można go tworzyć przy użyciu innych metod, ewentualnie można wczytać i sparsować istniejący plik INI metodą loadFile()
CDomkoINI(const std::string filename)drugi konstruktor; inicjalizuje klasę, wczytuje i parsuje plik INI, którego nazwa podana jest w parametrze filename; ponieważ ten konstruktor nie zwraca żadnej wartości, należy samemu sprawdzić, po jego wykonaniu, czy nie wystąpił żaden błąd – dane te można uzyskać używając metod getErrorCode() i getErrorLine()
~CDomkoINI()destruktor; jak każdy porządny destruktor sprząta po klasie i czyści pamięć
unsigned int getClassVersionMajor() constmetoda zwracająca główny numer wersji klasy
unsigned int getClassVersionMinor() constmetoda zwracająca poboczny numer wersji klasy
unsigned int getClassVersionRevision() constmetoda zwracająca numer wersji klasy określający poprawki błędów
unsigned int getErrorCode() constmetoda zwracająca kod ostatniego błędu lub wartość 0 (EDomkoINIError(DOMKOINIERRORCODE_OK)), gdy go nie było; kod błędu jest przechowywany do czasu wystąpienia kolejnego błędu; zamiast kodów liczbowych można stosować wartości z typu wyliczeniowego EDomkoINIError (patrz: tabela 4.2)
unsigned int getErrorLine() constmetoda zwracająca numer linii w pliku INI, w której wystąpił błąd lub 0, gdy błąd nie dotyczył samej zawartości pliku albo gdy błąd nie wystąpił; numer linii z błędem jest przechowywany do czasu wystąpienia kolejnego błędu, który zwraca numer linii jego wystąpienia
bool checkLoaded() constmetoda zwracająca informację o tym czy plik INI został wczytany i sparsowany – true oznacza, że tak, a false, że nie
bool setBehaviour(const unsigned int type, const bool value)metoda ustawiająca zachowanie klasy względem plików INI (jest to szerzej opisane w dalszej części niniejszej dokumentacji i w tabeli 4.3)
bool getBehaviour(const unsigned int type) constmetoda zwracająca ustawienia zachowania klasy względem plików INI (jest to szerzej opisane w dalszej części niniejszej dokumentacji i w tabeli 4.3)
unsigned int getBehavioursCount() constmetoda zwracająca ilość możliwości określenia zachowania klasy względem plików INI (jest to szerzej opisane w dalszej części niniejszej dokumentacji i w tabeli 4.3)
bool loadFile(const std::string filename)metoda wczytująca i parsująca plik INI, którego nazwa jest podana w parametrze filename; metody tej należy użyć jedynie w przypadku, gdy podczas inicjalizacji klasy użyto konstruktora bez parametru z nazwą pliku; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metod getErrorCode() i getErrorLine()
bool parseBuffer(char *buffer, const unsigned int length)metoda parsująca plik INI znajdujący się w buforze buffer o długości length; metodę tą należy zastosować wtedy, gdy posiadamy już w buforze wczytaną zawartość pliku INI i każda linia tekstu w buforze zakończona jest znakiem ASCII o kodzie 10 (zgodnie z systemem MacOS), 13 (zgodnie z systemem Linux) lub parą znaków o kodach, odpowiednio, 10 i 13 (zgodnie z systemem Windows); zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metod getErrorCode() i getErrorLine()
bool parseTextBuffer(std::vector <std::string> lines)metoda parsująca plik INI znajdujący się w buforze lines zawierającym tablicę z poszczególnymi liniami pliku; metodę tą należy zastosować wtedy, gdy posiadamy już w buforze wczytaną zawartość pliku INI w takiej postaci w jakiej występuje parametr tej metody; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metod getErrorCode() i getErrorLine()
bool saveFile(const std::string filename)metoda zapisująca sparsowany plik INI do pliku o nazwie podanej w parametrze filename; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool getValueString(std::string sectionName, std::string key, std::string &output)metoda pobierająca wartość tekstową z klucza key znajdującego się w sekcji sectionName; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool getValueInt(std::string sectionName, std::string key, int &output)metoda pobierająca wartość liczbową z klucza key znajdującego się w sekcji sectionName; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool getValueStringByPath(const std::string path, std::string &output)metoda pobierająca wartość tekstową z sekcji i klucza określonych ścieżką path, która jest w postaci „SEKCJA/KLUCZ”, np. wartość „person/firstname” prowadzi do sekcji „person” i klucza „firstname”; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool getValueIntByPath(const std::string path, int &output)metoda pobierająca wartość liczbową z sekcji i klucza określonych ścieżką path, która jest w postaci „SEKCJA/KLUCZ”, np. wartość „person/firstname” prowadzi do sekcji „person” i klucza „firstname”; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool setValueString(std::string sectionName, std::string key, std::string value)metoda ustawiająca wartość tekstową z klucza key znajdującego się w sekcji sectionName; jeżeli klucz lub sekcja nie istnieją, zostaną utworzone; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool setValueInt(std::string sectionName, std::string key, int value)metoda ustawiająca wartość liczbową z klucza key znajdującego się w sekcji sectionName; jeżeli klucz lub sekcja nie istnieją, zostaną utworzone; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool setValueStringByPath(const std::string path, std::string value)metoda ustawiająca wartość tekstową w sekcji i kluczu określonych ścieżką path, która jest w postaci „SEKCJA/KLUCZ”, np. wartość „person/firstname” prowadzi do sekcji „person” i klucza „firstname”; jeżeli klucz lub sekcja nie istnieją, zostaną utworzone; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
bool setValueIntByPath(const std::string path, int value)metoda ustawiająca wartość liczbową w sekcji i kluczu określonych ścieżką path, która jest w postaci „SEKCJA/KLUCZ”, np. wartość „person/firstname” prowadzi do sekcji „person” i klucza „firstname”; jeżeli klucz lub sekcja nie istnieją, zostaną utworzone; zwracana wartość false oznacza wystąpienie błędu, którego dane można uzyskać używając metody getErrorCode()
 
 
Większość metod zwraca, w razie problemów, kod błędu, który można odczytać używając metody getErrorCode(). Dla ułatwienia w tworzeniu własnego programu, klasa zawiera typ wyliczeniowy EDomkoINIError, który opisowo (przez nazwę stałych, a nie kod liczbowy) stara się podać przyczynę błędu.

Pełną listę błędów, wraz z krótkim opisem, prezentuje tabela 4.2.

Tabela 4.2: Lista kodów błędów

kodstała (typ wyliczeniowy EDomkoINIError)opis
0DOMKOINIERRORCODE_OKbrak błędu
1DOMKOINIERRORCODE_LOADINGbłąd wczytywania pliku INI – możliwe, że plik nie istnieje lub jego struktura została uszkodzona
2DOMKOINIERRORCODE_NOEQUALSIGNbrak znaku równości („=”) oddzielającego klucz od wartości
3DOMKOINIERRORCODE_CANNOTPARSESECTIONbłędnie podana nazwa sekcji – prawdopodobnie brak jednego z wymaganych nawiasów kwadratowych („[„, „]”)
4DOMKOINIERRORCODE_EQUALSIGNIVALUEwartość zawiera znak równości („=”), który może występować jedynie jako znak oddzielający klucz od wartości; błąd ten nie występuje, gdy włączona jest funkcjonalność (przy pomocy metody setBehaviour()) o kodzie 3 (patrz: tabela 4.3)
5DOMKOINIERRORCODE_NONUMERICVALUEpobierana wartość liczbowa zawiera niedozwolone znaki, które nie są cyframi ani znakiem minus („-„) na początku tekstu
6DOMKOINIERRORCODE_NOSECTIONnie znaleziono podanej sekcji
7DOMKOINIERRORCODE_NOKEYnie znaleziono podanego klucza
8DOMKOINIERRORCODE_SECTIONDUPLICATEsekcja o danej nazwie już istnieje; błąd ten nie występuje, gdy włączona jest funkcjonalność (przy pomocy metody setBehaviour()) o kodzie 1 (patrz: tabela 4.3)
9DOMKOINIERRORCODE_KEYDUPLICATEklucz o danej nazwie już istnieje w tej samej sekcji; błąd ten nie występuje, gdy włączona jest funkcjonalność (przy pomocy metody setBehaviour()) o kodzie 2 (patrz: tabela 4.3)
10DOMKOINIERRORCODE_INVALIDSECTIONCHARACTERSużyto niedozwolonych znaków w nazwie sekcji; dozwolonymi znakami są wszystkie znaki alfanumeryczne oraz odwrotny ukośnik („\”), pauza („-„) i podkreślenie („_”)
11DOMKOINIERRORCODE_INVALIDKEYCHARACTERSużyto niedozwolonych znaków w nazwie klucza; dozwolonymi znakami są wszystkie znaki alfanumeryczne oraz odwrotny ukośnik („\”), pauza („-„) i podkreślenie („_”)
12DOMKOINIERRORCODE_WRONGPATHFORMATużyto błędnego formatu ścieżki wskazującej na sekcję i klucz; prawidłowy format to „SEKCJA/KLUCZ”
 
 
Z pewnością więcej wyjaśnienia niż suchy opis wymagają metody setBehaviour(), getBehaviour() i getBehavioursCount(). Klasa CDomkoINI pozwala na modyfikację niektórych jej zachowań, np. dotyczących duplikowania sekcji.

Każde zachowanie może być włączone lub wyłączone – jest typu bool. W każdej chwili można sprawdzić jak ustawione jest wybrane zachowanie. Aby tego dokonać należy użyć metody:

bool getBehaviour(const unsigned int type) const

Jako parametr trzeba podać numer zachowania lub skorzystać z typu wyliczeniowego EDomkoINIBehaviour (patrz: tabela 4.3). Metoda ta zwraca wartość true lub false, która określa stan wybranego zachowania.

Podobnie do poprzedniej metody używa się metody:

bool setBehaviour(const unsigned int type, const bool value)

Jednak tutaj trzeba też podać wartość (parametr value), która określa, czy zachowanie ma być włączone (wartość true) czy wyłączone (wartość false).

Ostatnia metoda dotycząca zachowań ma jedynie ogólny charakter informacyjny, ponieważ zwraca ilość dostępnych zachowań do modyfikacji. Metoda ta ma postać:

unsigned int getBehavioursCount() const

W obecnej wersji klasy, metoda ta zwraca zawsze wartość 4.

W tabeli 4.3 znajduje się pełna lista dostępnych zachowań.

Tabela 4.3: Lista kodów zachowań klasy

kodstała (typ wyliczeniowy EDomkoINIBehaviour)opis
0DOMKOINIBEHAVIOUR_ALLOWHASHCOMMENTSpozwala na używanie znaku hash („#”) do oznaczania komentarzy
1DOMKOINIBEHAVIOUR_ALLOWSECTIONDUPLICATESpozwala na używanie tych samych nazw dla więcej niż jednej sekcji; wszystkie sekcje o tej samej nazwie zostaną połączone w jedną
2DOMKOINIBEHAVIOUR_ALLOWKEYDUPLICATESpozwala na używanie tych samych nazw dla więcej niż jednego klucza wewnątrz tej samej sekcji; ostateczną wartością klucza będzie ta, która została podana jako ostatnia z tą samą nazwą klucza
3DOMKOINIBEHAVIOUR_ALLOWEQUALSIGNINVALUEpozwala na używanie znaku równości („=”) wewnątrz wartości


5. Użycie klasy

Na początek należy pamiętać, aby dołączyć nagłówki dyrektywą kompilatora #include.

#include <CDomkoINI/cdomkoini.h>

Jeżeli pliki klasy CDomkoINI znajdują się w tym samym katalogu co program, należy wpisać następujący kod:

#include „cdomkoini.h”

Typowym wywołaniem klasy jest użycie konstruktora bez parametrów, co przygotowuje klasę i pozwala na tworzenie nowego pliku INI bądź późniejsze wczytanie już istniejącego.

Kod inicjalizujący klasę może wyglądać tak:

CDomkoINI* iniClass = new CDomkoINI();

Po wykonaniu kodu, obiekt iniClass będzie wskazywał na klasę, która gotowa jest do tworzenia nowych sekcji i kluczy. Jeżeli dany obiekt ma operować na istniejącym już pliku INI, można, po wykonaniu konstrukcji, użyć metody loadFile() w celu jego wczytania. Kod to realizujący wyglądałby wtedy tak:

CDomkoINI* iniClass = new CDomkoINI();
iniClass->loadFile("file.ini");


Jednak istnieje również drugi konstruktor klasy, który od razu wczytuje wskazany plik INI. Zamiast więc pisać to, co powyżej, wystarczy napisać:

CDomkoINI* iniClass = new CDomkoINI("file.ini");

Podczas używania klasy CDomkoINI należy pamiętać o obsłudze błędów. Do wykrywania błędów służą metody getErrorCode() i getErrorLine(). Metody, które ustawiają kody błędów, zwracają jednocześnie false, aby zaznaczyć, że coś nie zadziałało. Prawidłowo napisany program powinien sprawdzać status zwracany przez metodę i obsługiwać odpowiednio błędy.

Po wprowadzeniu powyższych uwag, kod może wyglądać tak:

CDomkoINI* iniClass = new CDomkoINI();
if (!iniClass->loadFile("file.ini")) {
unsigned int errCode = iniClass->getErrorCode();
unsigned int errLine = iniClass->getErrorLine();
// kod obsługujący błąd
} else {
// błąd nie wystąpił – plik INI został wczytany
}


Operowanie na danych pliku INI sprowadza się do pobierania lub dodawania wartości wybranego klucza z wybranej sekcji. Aby pobrać wartość klucza „firstname” z sekcji „person” należy wykonać kod:

std::string value;
if (!iniClass->getValueString("person", "firstname", value)) {
// kod obsługujący błąd
} else {
// błąd nie wystąpił – plik INI został wczytany
}


Jeżeli wartość na być liczbowa, warto zamiast getValueString() użyć metody getValueInt(), która dokonuje konwersji tekstu na wartość liczbową.

Istnieje też druga możliwość podawania o który klucz i sekcję chodzi. Należy w tym celu użyć tzw. ścieżek, czyli jednego tekstu zawierającego nazwę sekcji i klucza oddzielonych ukośnikiem („/”), np. „person/firstname”.

Przykładowy kod to realizujący mógłby wyglądać tak:

std::string value;
if (!iniClass->getValueStringByPath("person/firstname", value)) {
// kod obsługujący błąd
} else {
// błąd nie wystąpił – plik INI został wczytany
}


Dla uzyskania wartości liczbowej należałoby użyć metody getValueIntByPath().

Należy pamiętać, aby na koniec, gdy obiekt wskazujący na klasę, przestanie być potrzebny, wykonać destrukcję klasy tradycyjnym kodem:

delete iniClass;



6. Przykładowy program

Do klasy został dołączony przykładowy program, który korzysta z niektórych jej metod. Jego analiza może pomóc w dokładniejszym zapoznaniu się z możliwościami klasy i sposobami ich użycia.

Przykładowy program jest uruchamiany z linii komend. Potrafi on wczytać i zapisać plik INI, a także pobrać oraz dodać lub zmienić wartość wybranego klucza z wybranej sekcji.

Program wywołuje się poleceniem iniparser i przyjmuje ono następujące parametry:

  • –behaviour NUMER – można też używać polecenia „-b”; aktywuje funkcjonalność (zachowanie) klasy o numerze NUMER; dozwolone numery znajdują się w tabeli 4.3;
  • –clear NUMER – można też używać polecenia „-c”; deaktywuje funkcjonalność (zachowanie) klasy o numerze NUMER; dozwolone numery znajdują się w tabeli 4.3;
  • –get SEKCJA/KLUCZ – można też używać polecenia „-g”; wyświetla wartość klucza KLUCZ z sekcji SEKCJA;
  • –help – można też używać polecenia „-h”; wyświetla pomoc;
  • –input PLIK – można też używać polecenia „-i”; wczytuje plik INI o nazwie PLIK; parametr ten jest obowiązkowy;
  • –output PLIK – można też używać polecenia „-o”; zapisuje plik INI o nazwie PLIK; wykonywane jest to po wszystkich zmianach dokonanych przez inne polecenia;
  • –set SEKCJA/KLUCZ=WARTOŚĆ – można też używać polecenia „-s”; ustawia klucz KLUCZ z sekcji SEKCJA na wartość WARTOŚĆ; jeżeli sekcja lub klucz nie istnieją, to są one tworzone;
  • –version – można też używać polecenia „-v”; wyświetla informacje o wersji programu i klasy.


7. Wersje dokumentacji

  • 11.04.2012
    • pierwsza wersja dokumentacji


8. Wersje klasy

  • 1.0.0 (11.04.2012)
    • pierwsza wersja klasy



Pliki do ściągnięcia

CDomkoINI 1.0.0 (2,47 MB)
 
pliki przeskanowano programami antywirusowymi: Norton Antivirus (wersja 17.9.0.12, definicje wirusów z dnia 11.04.2012), Microsoft Security Essentials (wersja 2.1.1116.0, definicje wirusów z dnia 11.04.2012)

Brak komentarzy


Ta strona używa "ciasteczek" ("cookies"), które są zapisywane na Twoim urządzeniu końcowym. Więcej informacji