art11










Wymiana danych pomiędzy programami




Pewnie czasem chciałeś zrobić zmienną "globalną dla
całego systemu", tak, by łatwo wymieniać dane pomiędzy
programami. Oczywiście można potrzebne dane zapisywać w pliku
czy Rejestrze, i jest to dobra metoda, jeżeli odwołujemy się
do nich jeden, dwa czy dzesięć razy. Ale przy tysiącach
odwołań szybkość programu spada niemiłosiernie.

Rzowiązaniem są tzw. mapy pamięci. Wiem, że sama nazwa
brzmi strasznie :), ale jak zobaczycie wykorzystanie ich wcale
nie jest takie trudne (choc i tak byłoby łatwiejsze gdyby nie
pewne ograniczenia VB). Cóż to w ogóle jest? Otóż mapa jest
to wydzielony obszar pamięci o konkretnej nazwie, dostępny dla
wszystkich programów. Ma on ustaloną nazwę i rozmiar.

No więc zaczynajmy :) Pierwszą rzeczą jaką musimy zrobić
to nadanie nazwy mapie, która musi być unikalna w skali całego
systemu. Najlepiej zadeklarować ją jako stałą. Tak więc:

Const NazwaMapyPamieci =
"NaStoProcentUnikalnaNazwaMapyPamieci :))"

Druga sprawa: musimy określic, jakie dane będziemy
wymieniać między programami. Zazwyczaj nie jest to pojedyncza
zmienna, dlatego najlepiej użyć struktury:

Type SharedData
Integer1 As Integer
Long1 As Long
Tablica1(255) As Byte
...
End Type

Potrzebne są też zmienne: jedna to tzw. uchwyt do mapy (w
Windows do wszystkiego są uchwyty, więc dlaczego i do tego nie?
:)), druga to po prostu nasza struktura, na której będziemy
operować w programie. Natomiast trzecia to tzw.wskaźnik.
Niestety, VB nie ma typów wskaźnikowych, więc użyjemy Longa
(tutaj potrzebowalibyśmy akurat wskaźnika na naszą
strukturę).

Dim Dane As SharedData
Dim UchwytMapy As Long
Dim WskaznikNaMape As Long

Dobrze, teraz mamy już wreszcie wszystko :) Możemy stworzyć
mapę:

UchwytMapy = CreateFileMapping(&HFFFFFFFF,
0, PAGE_READWRITE, 0, Len(Dane), NazwaMapyPamieci)

Funkcja ta jest dosyc skomplikowana, zapamiętaj tylko że
ostatni parametr to zawsze nazwa mapy (NaPewnoUnikalna :)), a
przedostatni - jej rozmiar (w tym przypadku rozmiar naszej
struktury).
Po utworzeniu mapy możemy ją otworzyć. Możemy to zrobić
zarówno w tym, jak i innym programie. Jeżeli robimy to w tym
samym programie, w którym ją stworzyliśmy, to lepiej
zapamiętajmy jej uchwyt w innej zmiennej niż poprzednio
(chociaż teoretycznie może być on i w poprzedniej zmiennej
zapamiętany):

UchwytMapy2 =
OpenFileMapping(FILE_MAP_WRITE, 1, NazwaMapyPamieci)

Parametr pierwszy znaczy że otwieramy mape do odczytu i
zapisu, natomiast trzeci to znowu jej nazwa.
Uff, dużo z tym roboty ;) Jeszcze dwie rzeczy. Po pierwsze
musimy odczytać adres naszej mapy (czyli wskaźnik na nią,
teraz wiesz po co był potrzebny):

WskaznikNaMape =
MapViewOfFile(UchwytMapy2, FILE_MAP_ALL_ACCESS, 0, 0, 0)

Drugą rzecz będziemy wykonywac tylko w VB (bo chyba
domyślasz się z mapy moga korzystać też programy napisane w
innych językach!). Ponieważ sam wskaźnik nc nam nie daje,
musimy niejako "przerobić" go na zdatne do odczytania
dane. Tak naprawde jednak musimy przekopiować zawartość mapy
do naszej struktury, tak by móc potem się do niej wygodnie
odwoływać. A więc:

CopyMemory ByRef Dane, ByVal
WskaznikNaMape, Len(Dane)

Po tych trzech czynnościach mamy pełen dostęp do danych.
Kiedy już w danym programie skończymy z nimi pracę, trzeba
mapę zamknąć. W VB jednak musimy też skopiować dane ze
struktury z powrotem do mapy:

UnmapViewOfFile WskaznikNaMape
WskaznikNaMape = MapViewOfFile(UchwytMapy2, FILE_MAP_ALL_ACCESS,
0, 0, 0)
CopyMemory ByVal WskaznikNaMape, ByRef Dane, Len(Dane)

Wskaźnik uzyskujemy ponownie, gdyz podczas gdy program
pracował adres mapy mógł się zmienić. Następnie ostatecznie
zwalniamy wskaźnik i zamykamy uchwyt:

UnmapViewOfFile WskaznikNaMape
CloseHandle UchwytMapy

I tyle :)))

 

 

Karol Kuczmarski
qkarol@go2.pl
http://www.qkarol.prv.pl
GG: 1284020






Wyszukiwarka

Podobne podstrony:
ART11 (4)
art11
art11 budowa domu na skarpie
ART11 (3)
art11
art11
art11
ART11
ART11 (7)

więcej podobnych podstron