Gestion et partage de mémoire

cs_RaSa Messages postés 3 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 18 avril 2005 - 18 avril 2005 à 02:25
cs_RaSa Messages postés 3 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 18 avril 2005 - 18 avril 2005 à 02:39
Bonjour à tous,
Je pensais avoir une idée assez claire de la manière dont windows gère la mémoire. En me penchant sur l'interface IDataObject de COM (et des exemple d'implémentation) je bloque un peu. Merci de votre aide.

Etat de connaissance:
----------------------
En résumé: au chargement d'une application, le processus résultant se voit allouer un espace d'adressage virtuelle de 4Go, 2Go sont réservés aux resources systemes (dll windows, fichiers mappés...); les deux autres contiennent le code de l'exe, des dll dont il a besoin (modules), les piles et les tas que le processus utilise pour gerer ses données. Les 2 Go inférrieures sont privés au processus, d'autre processus ne peuvent pas y accéder. Lorsque plusieur processus souhaitent échanger des données, ils passent par des fichiers partagé, pipe etc...

La source du problème:
------------------------
Voici un extrait de code, c'est une classe C++ implementant l'interface IDataObject où
m_pStgMedium est une structure de donnée membre contenant les données de l'objet C++ (dans m_pStgMedium.hGlobal).
Le client utilise la fonction CDataObject::GetData(...) en passant en argument une structure de donnée STGMEDIUM qui recoit les données.

HRESULT __stdcall CDataObject::GetData(FORMATETC * pFormatEtc, STGMEDIUM * pStgMedium)
{
(...)
DWORD dwLen = GlobalSize(m_pStgMedium.hGlobal); //Longeur des données
PVOID pvSource = GlobalLock(m_pStgMedium.hGlobal);//Obtient l'adresse des données

PVOID pvDest = GlobalAlloc(GMEM_FIXED,dwLen); //Alloue de la memoire pour y copier les données.

memcpy(pvDest, pvSource); //Copie les données

GlobalUnlock(m_pStgMedium.hGlobal);

pStgMedium->hGlobal = (HGLOBAL) pvDest; //Positionne la variable pacée par le client vers le nouveau bloc de données

(...)
}

Le code fonctionne très bien.
Notons au passage que l'interface IDataObject est utilisée (entre autre) pour le drag & drop; dans une application ou entre plusieur applications.

Prenons le cas d'une operation de Drag & drop entre deux application.

Le probleme
-------------

L'instance de l'objet c++ implementant l'interface IDataObject réside dans un processus, il alloue donc de la mémoire sur le tas de ce processus.

Le code qui appelle la méthode GetData(...) (le client) réside dans un autre processus. Il recoit un pointeur vers les données (plus précisément un Handle) allouées par l'objet.

La question
------------

Comme je l'ai dit le code fonctionne correctement, j'ai essayé d'echanger des chaîne de caractères entre plusieur application ca fonctionne bien.

Mais comment c'est possible ?

Merci. (pour les courageux qui aurons lu jusque la).

1 réponse

cs_RaSa Messages postés 3 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 18 avril 2005
18 avril 2005 à 02:39
Rebonjour,
Je viens de relire le message que je viens de poster.
Je vais essayer de fair plus court.

Si j'ecrit dans le processus A:
char * szText = new char[10];
strcpy(szText,"012345678");
long lAdressOfChar = (long) szText;
WriteToFile("c:\MyFile",lAdress);

Puis dans le processus B:
char * szText = NULL;
long lAdressOfChar = 0;
ReadFromFile("c:\MyFile", &lAdressOfChar);
szText = (char*) lAdressOfChar;

MessageBox(m_hWnd,szText,NULL,MB_OK);

delete [] szText;

Est ce que ca marche ? Si oui, comment ca se fait ?
0
Rejoignez-nous