Ogłoszenie 
Prosimy o zapoznanie się z nową wersją regulaminu forum (ver 003) oraz zasadami przetwarzania danych osobowych
Regulamin oraz zasady przetwarzania w dziale REGULAMIN

Poprzedni temat «» Następny temat
SystemInformation i dynamiczny pulpit
Autor Wiadomość
gk01
Waypoint


Dołączył: 04 Wrz 2009
Posty: 24
  Wysłany: 2011-01-13, 13:19   SystemInformation i dynamiczny pulpit


SystemInformation i dynamiczny pulpit

Program "SystemInformation" stworzony i udostępniony przez Daniela Schumanna (http://www.ultimatelaunch.de) jest najczęściej wykorzystywanym narzędziem do programowania nowych, ciekawych rozwiązań graficznych dla urządzeń nawigacyjnych działających pod kontrolą systemu Windows CE. Wraz z interpreterem skryptów "MortScript", którego autorem jest Mirko Schenk (http://mirko-schenk.software.informer.com) tworzą zgraną parę narzędzi pozwalających na tworzenie rozwiązań ograniczonych jedynie wyobraźnią projekatnta i programisty.

Skupmy przez chwilę uwagę na pewnych własnościach obu tych narzędzi. Język skryptowy interpretowany przez "MortScript" posiada wygodny interfejs do obsługi klasycznych plików "INI" znanych nam z systemów operacyjnych rodziny MS Windows i służących do przechowywania informacji o konfiguracji. Mam tu na myśli funkcje IniRead i IniWrite. Klasyczny plik "INI" posiada w swojej nazwie rozszerzenie "ini" (np: "win.ini") i ma następujący format:

Kod:
[Sekcja1]
Dana1 = Wartość
Dana2 = Wartość

[Sekcja2]
Dana3 = Wartość
Dana4 = Wartość
...

Liczba sekcji i danych może być dowolna. Wartości mogą być dowolnym tekstem, liczbą całkowitą lub zmiennoprzecinkową.

Aby odczytać daną wartość z pliku w języku skryptowym "MortScript" należy posłużyć się funkcją IniRead, której składnia jest następująca:

Kod:
wartość = IniRead (nazwa_pliku, sekcja, dana)

Funkcja zwróci nam wartość danej zapisanej w wybranym pliku i sekcji. Aby zapisać daną wartość do pliku w języku skryptowym "MortScript" należy posłużyć się funkcją IniWrite, której składnia jest następująca:

Kod:
IniWrite (nazwa_pliku, sekcja, dana, wartość)

Funkcja zapisze do wybranego pliku, sekcji i danej podaną wartość.

Obie te funkcje posiadają także opcjonalny parametr pozwalający określić stronę kodową odczytywanego/zapisywanego pliku "INI", który na obecnym etapie rozważań jest nieistotny.

Jak zapewne większość osób programujących swoje pulpity wie, program "SystemInformation" także posługuje się plikami z rozszerzeniem "ini". Niestety format tych plików odbiega od opisanego powyżej.

Różnice pomiędzy klasycznym plikiem "INI", a plikiem "ini" interpretowanym przez "SystemInformation" istotne z punktu widzenia zaproponowanego rozwiązania są następujące:

1. Komentarz. W klasycznym pliku "INI" komentarz zaczyna się od średnika (;). Tekst pomiędzy średnikiem, a końcem linii jest traktowany jako komentarz. W pliku "ini" interpretowanym przez "SystemInformation" komentarz zaczyna się od kratki (#). Tekst pomiędzy kratką, a końcem linii jest traktowany jako komentarz.

Ściśle rzecz biorąc, należało by napisać, że kratka jest najczęściej wykorzystywanym znakiem komentarza. Znakami komentarza pliku "ini" interpretowanym przez "SystemInformation" mogą być także (wg oficjalnej dokumentacji) ukośnik, średnik i apostrof (/;'). Jak się jednak okazuje, jest jeszcze jeden znak, który może rozpoczynać komentarz w plikach "ini" dla "SystemInformation". Jest to lewy okrągły nawias: "(".

2. Nazwa sekcji. Nazwa sekcji w klasycznym pliku "INI" zawarta jest w nawiasach kwadratowych. Nazwa sekcji w pliku "ini" interpretowanym przez "SystemInformation" nie jest zawarta jest w nawiasach kwadratowych. Dodatkowo w pliku "ini" interpretowanym przez "SystemInformation" nazwy sekcji mogą się powtarzać.

Oczywiście w klasycznym pliku "INI" nazwy sekcji także mogą się powtarzać, lecz wszystkie sekcje o tej samej nazwie, poza pierwszą, pozostaną "martwe". Funkcje odczytujące/zapisujące do pliku operować będą wyłącznie na pierwszej sekcji o danej nazwie.

Gdyby udało się zastosować funkcje "interpretera "MostScript" odczytu/zapisu do klasycznych plików "INI, aby poprawnie operowały na plkach "ini" interpretowanych przez "SystemInformation" otrzymalibyśmy tytułowy

DYNAMICZNY PULPIT

Ale czy to jest możliwe? Odpowiedź brzmi: TAK

Nie posiadamy kodu źródłowego "SystemInformation" dlatego też modyfikacje muszą być wykonane na poziomie plików binarnych (mam nadzieję, że autor nie będzie miał tego za złe, gdyż wszystko to służy jedynie celom edukacyjnym).

Pierwsza modyfikacja polega na tym, aby program "SystemInformation" traktował jako komentarz linię zaczynającą się od lewego nawiasu kwadratowego ([). Dięki temu, gdy dopiszemy w pliku "ini" interpretowanym przez "SystemInformation" nazwę sekcji w nawiasach kwadratowych (np: "[Podpis]"), będzie ona ignorowana przez "SystemInformation", ale funkcje "MostScript" odczytu/zapisu do plików "INI" będą się mogły do takiej sekcji odwoływać. Aby to zrobić wykorzystamy nieudokumentowany znak komentarza opisany wcześniej jakim jest lewy okrągły nawias i zamienimy go na lewy kwadratowy nawias.

Posługując się edytorem binarnym zamienimy w pliku "SystemInformation32.exe" pod adresem 0xA9E3 wartośś 0x28 na 0x5B. Jeżeli chodzi o kod x86, zmaina będzie następująca:

Przed zmianą:

Kod:
cmp ax, 28h
jz loc_40B01A

Po zmianie:

Kod:
cmp ax, 5Bh
jz loc_40B01A


Dzięki tej modyfikacji, w dowolnym miejscu pliku "ini" dla "SystemInformation" możemy wstawić nazwę sekcji w nawiasach kwadratowych i się do niej odwołać za pomocą funkcji IniRead/IniWrite interpretera MortScript.

Przyglądnijmy się opisowi przycisku/ikony/grafiki stosowanemu zwykle w plikach "ini" dla "SystemInformation":

Kod:
ICONXPBUTTON
x=54
y=154
Offset=0
Command=\My Flash Disk\Program Files\mPanel\Scripts\SkinzSudoku.mscr
SizeNormal=48
SizePushed=32
IconNormal=..\Icons\skinzsudoku.ico
IconPushed=..\Icons\skinzsudoku.ico

TEXT
x=40
y=204
Text=Skinz Sudoku
Color=DDEEFF
FrameColor=556677
Size=13
Weight=700
Font=Tahoma
CreateFont

Taraz wystarczy przed ICONXPBUTTON i TEXT dodać swoje unikalne nazwy sekcji...

Kod:
[Ikona_1]
ICONXPBUTTON
x=54
y=154
Offset=0
Command=\My Flash Disk\Program Files\mPanel\Scripts\SkinzSudoku.mscr
SizeNormal=48
SizePushed=32
IconNormal=..\Icons\skinzsudoku.ico
IconPushed=..\Icons\skinzsudoku.ico

[Podpis_1]
TEXT
x=40
y=204
Text=Skinz Sudoku
Color=DDEEFF
FrameColor=556677
Size=13
Weight=700
Font=Tahoma
CreateFont

... i możemy użyć funkcji IniRead/IniWrite do zmiany danych. Odczyt współrzędnych ikony i podpisu za pomocą funkcji IniRead:

Kod:
x1 = IniRead ("filename.ini", "Ikona_1", "x", "unicode-prefix")
y1 = IniRead ("filename.ini", "Ikona_1", "y", "unicode-prefix")
x2 = IniRead ("filename.ini", "Podpis_1", "x", "unicode-prefix")
y2 = IniRead ("filename.ini", "Podpis_1", "y", "unicode-prefix")

Przesunięcie współrzędnych ikony i podpisu o 100 pikseli w prawo i o 50 pikseli w dół za pomocą funkcji IniWrite w skrypcie "MortScript":

Kod:
IniWrite ("filename.ini", "Ikona_1", "x", x1 + 100, "unicode-prefix")
IniWrite ("filename.ini", "Ikona_1", "y", y1 + 50, "unicode-prefix")
IniWrite ("filename.ini", "Podpis_1", "x", x2 + 100, "unicode-prefix")
IniWrite ("filename.ini", "Podpis_1", "y", y2 + 50, "unicode-prefix")

Proszę zwrócić uwagę, że zarówno przy odczycie jak i zapisie do pliku "ini" użyty został opcjonalny parametr (o którym wspomniałem wcześniej) "unicode-prefix", jako że pliki "ini" dla "SystemInformation" są plikami w formacie unicode.

W podanym powyżej przykładzie sekcje ICONXPBUTTON i TEXT stanowią pewnien komplet: jest to grafika i jej podpis. Rodzi się więc pokusa, aby objąć je jedną sekcją w nawiasach kwadratowych (nieistotne w tym momencie fragmenty zostały wykropkowane):

Kod:
[Skinz_Sudoku]
ICONXPBUTTON
x=54
y=154
...

TEXT
x=40
y=204
...

Niestety w tym konkretnym przypadku na przeszkodzie stoją takie same nazwy parametrów określających współrzędne ikony i tekstu (x, y). Jednak okazuje się, że wystarczy kolejna modyfikacja, aby obie sekcje "SystemInformation" (ICONXPBUTTON i TEXT) objąć jedną sekcją w nawiasach kwadratowych.

Otóż nazwy parametrów definiujących współrzędne mogą być podawane zarówno jako małe jak i duże litery (xXyY). Możemy zrezygnować z dużych liter na rzecz innych nazw współrzędnych.

Druga modyfikacja kodu polega na tym, aby współrzędne mogły być podawane za pomocą dodatkowej pary oznaczeń. Na przykład małych liter "h" i "v". Mamy więc do dyspozycji: "x" i "h" na określenie poziomej współrzędnej, oraz "y" i "v" na określenie pionowej współrzędnej. Przykładowy fragment pliku "ini" będzie wyglądał tak (nieistotne w tym momencie fragmenty zostały wykropkowane):

Kod:
[Skinz_Sudoku]
ICONXPBUTTON
x=54
y=154
...

TEXT
h=40
v=204
...

Możemy teraz odwołać się do współrzędnych grafiki i tekstu:

Kod:
x = IniRead ("filename.ini", "Skinz_Sudoku", "x", "unicode-prefix")
y = IniRead ("filename.ini", "Skinz_Sudoku", "y", "unicode-prefix")
h = IniRead ("filename.ini", "Skinz_Sudoku", "h", "unicode-prefix")
v = IniRead ("filename.ini", "Skinz_Sudoku", "v", "unicode-prefix")
IniWrite ("filename.ini", "Skinz_Sudoku", "x", x + 100, "unicode-prefix")
IniWrite ("filename.ini", "Skinz_Sudoku", "y", y + 50, "unicode-prefix")
IniWrite ("filename.ini", "Skinz_Sudoku", "h", h + 100, "unicode-prefix")
IniWrite ("filename.ini", "Skinz_Sudoku", "v", v + 50, "unicode-prefix")

Aby "SystemInformation32.exe" interpretował poprawnie parametry "h" i "v" posługując się edytorem binarnym dokonamy w pliku "SystemInformation32.exe" następujących zmian:

Kod:
0x1D178: 0x58 -> 0x68
0x1D180: 0x59 -> 0x76

Jeżeli chodzi o kod x86, ta zmiana dokonywana jest w segmencie danych, czyli jest to zwykła definicja bajtów, do których odwołują się odpowiednie fragmenty kodu.

Skutkiem ubocznym takiego zabiegu jest to, że do określania współrzędnych możemy używać jedynie małych liter (xhyv). Użycie dużej litery spowoduje, że "SystemInformation" zgłosi błąd na etapie interpretacji pliku "ini".

Wszystkie opisy modyfikacji pliku "SystemInformation32.exe" dotyczą pakietu "SystemInformation" w wersji 1.6.1 (SystemInformation32.exe wersja 1.6.1.0).

Oczywiście "SystemInformation32.exe" to plik wykonywalny x86 przeznaczony dla Win32 i posłużyłem się nim jako przykładem. Tak naprawdę istotny dla nas jest plik "SystemInformation.exe" przeznaczony dla archiettury ARM uruchamiany pod Windows CE.

Przedstawione rozwiązanie zostało zastosowane w projekcie "mPanel" (od wersji 1.15). Informacje o tym panelu znajdują się w wątku:

Nawigacja GPS Strona Główna\HARDCORE\PULPIT ClubManiaca\mPanel
(http://www.my-navia.pl/viewtopic.php?t=23970)

Do pobrania

http://chomikuj.pl/gk01/SystemInformation

-- gk01 --
Ostatnio zmieniony przez gk01 2013-07-29, 21:53, w całości zmieniany 2 razy  
 
 
BladeX 
Maestro GPS
Kamil



Pomógł: 730 razy
Wiek: 108
Dołączył: 22 Gru 2008
Posty: 9736
Wysłany: 2011-01-13, 16:09   

Próbowąłem kiedyś robić coś podobnego, ale w inną stronę. Napisałem skrypt konwertujący z SysInformation INI na Standard INI i póżniej z powrotem, ale był jakiś problem z kodowania. Bodajże SystemInformation wymagał Unicode, a MortScript w żaden sposób nie chciał w ten sposób zapisać. Jak znajdę ten skrypt to wrzucę może ktoś go dostosuje.
_________________
Instalacja Automapy i patchowanie
Navia Nv45 | Clarion MAP770 | Mio Moov 200
Jeśli o czymś zapomniałem to PW z linkiem do postu. Nie pomagam na PW
 
 
dasior591 
Maestro GPS
GoClever 5065FMBT



Pomógł: 279 razy
Wiek: 28
Dołączył: 07 Cze 2008
Posty: 8301
Skąd: Poznań
Wysłany: 2011-01-14, 13:07   

GRATULUJE, naprawdę.
Sam też wpadłem na ten pomysł jakiś rok temu ale nie mam odpowiedniej wiedzy na temat. Z 3-4 razy zabierałem się do tego, ani w sysinfo nie umiałem zmieniać # na [ ani w morcie odwrotnie. Wiele osób na to czekało (choć większość jeszcze o tym nie wie :-) ).
_________________
Jeśli chcesz się odwdzięczyć zapraszam TUTAJ
Jak nie odpisuje w temacie lub na PW to się przypomnij :-)
 
 
 
BladeX 
Maestro GPS
Kamil



Pomógł: 730 razy
Wiek: 108
Dołączył: 22 Gru 2008
Posty: 9736
Wysłany: 2011-01-14, 16:54   

Przyklejam, aby inni zobaczyli. ;-)

[ Dodano: 2011-01-14, 18:34 ]
Za co odpowiadają zmiany?
E214:v(0x76)>Y(0x59)
E21C:h(0x68)>X(0x58)
Oczywiścia wersja ARM
_________________
Instalacja Automapy i patchowanie
Navia Nv45 | Clarion MAP770 | Mio Moov 200
Jeśli o czymś zapomniałem to PW z linkiem do postu. Nie pomagam na PW
 
 
gk01
Waypoint


Dołączył: 04 Wrz 2009
Posty: 24
Wysłany: 2011-01-18, 12:45   

SystemInformation32.exe (x86)

Kod:
+----+---------+--------------+------------+
| LP | ADRES   | PRZED ZMIANĄ | PO ZMIANIE |
+----+---------+--------------+------------+
|  1 | 0x0A9E3 |         0x28 |       0x5B |
|  2 | 0x1D178 |         0x58 |       0x68 |
|  3 | 0x1D180 |         0x59 |       0x76 |
+----+---------+--------------+------------+

  1. Zamiana nieudokumentowanego znaku komentarza "(" na "[".
  2. Zamiana litery używanej do definicji współrzędnej poziomej obiektu "X" na "h".
  3. Zamiana litery używanej do definicji współrzędnej pionowej obiektu "Y" na "v".

SystemInformation.exe (ARM)

Kod:
+----+---------+--------------+------------+
| LP | ADRES   | PRZED ZMIANĄ | PO ZMIANIE |
+----+---------+--------------+------------+
|  1 | 0x09F4C |         0x28 |       0x5B |
|  2 | 0x0E214 |         0x59 |       0x76 |
|  3 | 0x0E21C |         0x58 |       0x68 |
+----+---------+--------------+------------+

  1. Zamiana nieudokumentowanego znaku komentarza "(" na "[".
  2. Zamiana litery używanej do definicji współrzędnej pionowej obiektu "Y" na "v".
  3. Zamiana litery używanej do definicji współrzędnej poziomej obiektu "X" na "h".

Szczegóły w pierwszym poście.

-- gk01 --
 
 
imar42 
guru
GC 5066FMBT



Pomógł: 61 razy
Wiek: 57
Dołączył: 05 Maj 2009
Posty: 1053
Skąd: Olsztyn
Wysłany: 2011-02-21, 13:08   

gk01 - jestem pod wielkim wrażeniem :!: Jak dla mnie to jest RE-WE-LA-CJA :idea:
Czy pozwolisz wykorzystać to rozwiązanie w moim uniwersalnym pulpicie?
Oczywiście z informacją o tym czyja w tym zasługa...
Właśnie nie wiedziałem :roll: jak rozwiązać sprawę z wpisywaniem zmiennej do podstrony w tym pulpicie o wielkości zainstalowanych dysków.
Teraz "dynamiczny pulpit" według Twojego pomysłu rozwiązał w mig tę trudność. 8-) :-)



[ Dodano: 2011-02-21, 13:15 ]
Gwoli uzupełnienia:
W moim pulpicie jeśli dysk wewnętrzny nazywa się tak jak u mnie: "ResidentFlash", to taka nazwa się w tym miejscu wyświetli, jeśli nazywa się NANDFlash to wyświetli się NANDFlash. Podobnie z kartą - u mnie nazywa się SDMMC i tak się wyświetla, gdyby nazywała się "Storage Card" wtedy w tym miejscu wyświetli się Storage Card
Dzięki raz jeszcze :mrgreen:

[ Dodano: 2011-03-16, 07:59 ]
Dzakus napisał/a:
SystemInformation wymagał Unicode, a MortScript w żaden sposób nie chciał w ten sposób zapisać.
Miałem ten sam problem z MortScript v 4.2
Przy każdej próbie zapisu z parametrem unicode-prefix wyskakiwał błąd Fatal (jeśli dobrze pamiętam) Invalid parameter
W wersji MS 4.3 ten problem zniknął, :idea: choć później musiałem wrócić w skrypcie do ver. 4.2
_________________
Uniwersalne ImarMenuRC do urządzeń z ekranem 480x272 i 320x240

 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Nasi znajomi:
Strona wygenerowana w 0,12 sekundy. Zapytań do SQL: 11