|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Messaggi: n/a
|
Chiarimenti GlobalAlloc e altre funzioni per la gestione della memoria
Salve a tutti,
avrei bisogno di alcuni chiarimenti in merito alle funzioni della gestione della memoria su Windows. In particolare il mio scopo è quello di scrivere dei dati di una variabile in un dato processo in una zona di memoria globale e leggere quest'aria in un'altro processo prendendone il contenuto. Consultando la MSDN, vedo queste funzioni che dovrebbero darmi una mano ... The GlobalAlloc function allocates the specified number of bytes from the heap. Windows memory management does not provide a separate local heap and global heap. [i] The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object's memory block. al che ho scritto due programmetti di test: questo per "scrivere" l'handle sul disco ... Codice:
HGLOBAL myGlobalMemoryHandle; int myInteger = 270578; int newInteger = 0; FILE *fp; myGlobalMemoryHandle = GlobalAlloc(GMEM_MOVEABLE, sizeof(int)); newInteger = (int)GlobalLock(myGlobalMemoryHandle); memcpy(&newInteger, &myInteger, sizeof(int)); GlobalUnlock(myGlobalMemoryHandle); fp = fopen("C:\\test.bin", "wb"); fwrite(&myGlobalMemoryHandle, sizeof(HGLOBAL), 1, fp); fclose(fp); Codice:
HGLOBAL myMemoryHandle; FILE *fp; int myInteger = 0; if ((fp = fopen("C:\\test.bin", "rb")) != NULL) { fread(&myMemoryHandle, sizeof(HGLOBAL), 1, fp); } myInteger = (int) GlobalLock(myMemoryHandle); Sbaglio qualcosa nei programmi oppure uso delle API errate? E se uso api errate ce ne sono che soddisfano la mia esigenza? |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Nota che GlobalLock ritorna un puntatore.
Quindi puoi fare: Codice:
HGLOBAL hMem; int *ptr; hMem = GlobalAlloc (GMEM_MOVEABLE, sizeof (int)); if (hMem != NULL) { ptr = (int*) GlobalLock (hMem); if (ptr != NULL) { *ptr = 12345; GlobalUnlock (hMem); } GlobalFree (hMem); } Codice:
int *ptr; ptr = (int*) GlobalAlloc (GMEM_FIXED, sizeof (int)); if (ptr != NULL) { *ptr = 12345; GlobalFree ((HGLOBAL) ptr); }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 09-11-2006 alle 11:19. |
![]() |
![]() |
![]() |
#3 |
Messaggi: n/a
|
Innanzi tutto grazie per la risposta.
Mi fai capire quindi che per la scrittura di una zona di memoria globale che andrà letta poi da un'altro processo (un exe per intenderci) la strada è questa. Il codice d'esempio che hai postato è per la scrittura della detta area di memoria, quindi per la lettura il mio Codice:
HGLOBAL myMemoryHandle; FILE *fp; int *myInteger = 0; if ((fp = fopen("C:\\test.bin", "rb")) != NULL) { fread(&myMemoryHandle, sizeof(HGLOBAL), 1, fp); } myInteger = (int*) GlobalLock(myMemoryHandle); PS: Sono "costretto" a passare l'handle da un processo all'altro via file ... non mi creerà casino per questo? Dovrebbe andare bene, giusto? |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Con il termine "global" non intende che il blocco è visibile da tutti i processi!!! P.S.: ho corretto il mio primo esempio sopra, ho scritto in fretta e non ho testato hMem.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Messaggi: n/a
|
Questo "leggerissimo" dubbio l'avevo dal primo momento.
Guarda, perdona se la richiesta banale ... ma sto leggendo e rileggendo la MSDN ma a questo punto non so che pesci prendere. Non c'è qualche API che mi permette di scrivere un'area condivisa di memoria tramite un processo e leggerla tramite un'altro? |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:25.