begin process at 2012 05 29 03:33:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Gestion et partage de mémoire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Gestion et partage de mémoire

lundi 18 avril 2005 à 02:25:44 | Gestion et partage de mémoire

RaSa

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).
lundi 18 avril 2005 à 02:39:22 | Re : Gestion et partage de mémoire

RaSa

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 ?
   



Cette discussion est classée dans : code, données, processus, pstgmedium, hglobal


Répondre à ce message

Sujets en rapport avec ce message

code pour la méthode Savitzky-Golay [ par thierrypp ] Bonjour,JE dispose de données en format *.txt, données numériques ( time, signal) et je souhaiterais disposer du code de Savitzky-Golay pour lisser ce code pour la méthode Savitzky-Golay [ par thierrypp ] Bonjour,JE dispose de données en format *.txt, données numériques ( time, signal) et je souhaiterais disposer du code de Savitzky-Golay pour lisser ce code pour la méthode Savitzky-Golay [ par thierrypp ] Bonjour,JE dispose de données en format *.txt, données numériques ( time, signal) et je souhaiterais disposer du code de Savitzky-Golay pour lisser ce code pour la méthode Savitzky-Golay [ par thierrypp ] Bonjour,JE dispose de données en format *.txt, données numériques ( time, signal) et je souhaiterais disposer du code de Savitzky-Golay pour lisser ce Terminer un processus [ par LordBob ] Bonjour a tous,voila j'essaie de fermer un processus (celui de MSN Messenger), j'ai donc fait comme ceci:TerminateProcess((FindWindow("msnmsgr.exe", N probleme avec CreateFile [ par Roudy ] Je veux créer un fichier qui contiendra le path de tout les processus a killer mais le probleme c que mon fichier ne veux pas rajouter les ligne dans Probleme de prise de données [ par DeViL_StRiKeR ] Salut tout le mone !J'aimerais savoir pk defois mes programmes deconnent comme par exemple si mon code ressemble a ca :char nom[100];printf("quel est Processus (HWP) multiple C sous UNIX? [ par cbismuth ] Bonjour à tous!Une question me rend fou depuis plusieurs jours...Je souhaite créer N processus (HWP, pas des threads) en C sous UNIX avec une boucle " Données dans DLL accessibles à divers processus (sous dev-C++) [ par graig2 ] Salut à tous, Voici ma toute première question sur ce forum, merci pour votre aide : Est ce qu'une DLL appelée par divers processus distincts peut c Base de données MYSQL [ par JR07 ] Je voudrais savoir si quelqu'un aurait du code avec des requêtes Mysql, qui permettent d'écrire et de lire dans une base de données. Le code que je so


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales