2009-10-12 8 views
1

Je souhaite lire les informations d'état fournies par une application via la mémoire partagée. Je veux utiliser C++ afin de lire le contenu de cette mémoire partagée nommée, puis l'appeler avec pinvoke d'une classe C#.C++ Lecture à partir de la mémoire partagée

À partir du logiciel, je sais qu'il a une certaine structure de fichier: Une structure STATUS_DATA avec un tableau de quatre structures de SYSTEM_CHARACTERISTICS. Je ne suis pas (encore) familier avec C++, donc j'ai essayé de suivre msdn fondamentalement. Pour trouver la taille du fichier à mapper, j'ai ajouté les tailles des membres de la structure comme à voir dans le code ci-dessous. Il en résulte un ACCÈS REFUSÉ, donc j'ai pensé, que le résultat basé sur les structures est trop élevé. Quand j'utilise sizeof(STATUS_DATA) (j'ai ajouté la structure à ma source), il finit toujours dans un ACCÈS REFUSÉ. Si j'essaie quelque chose de plus bas, comme 1024 octets, la seule chose que je peux voir dans pbuf est un <, pendant le débogage.

C'est ce que je suis arrivé à ce jour:

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 
#include <iostream> 
#pragma comment(lib, "user32.lib") 

using namespace std; 


signed int BUF_SIZE = 4 * (10368 + 16 + 4 + 16 + 4 + 16 + 4 + 1 + 4); // sizeof(STATUS_DATA); 
TCHAR szName[]=TEXT("ENGINE_STATUS"); 

int main() 
{ 
    HANDLE hMapFile; 
    unsigned char* pBuf; 

    hMapFile = OpenFileMapping(
        FILE_MAP_READ, // read access 
        FALSE,     // do not inherit the name 
        szName);    // name of mapping object 

    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not open file mapping object (%d).\n"), 
      GetLastError()); 

     return 1; 
    } 

    pBuf = (unsigned char*) MapViewOfFile(hMapFile, // handle to map object 
       FILE_MAP_READ, // read/write permission 
       0,      
       0,      
       BUF_SIZE); // 1024);     

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
      GetLastError()); 

    CloseHandle(hMapFile); 
     return 1; 
    } 

    UnmapViewOfFile(pBuf); 

    CloseHandle(hMapFile); 

    return 0; 
} 

J'ai aussi assuré que ce Mem partagé « est là » en suivant que hint. Quelqu'un peut-il me donner un indice, qu'est-ce qui me manque? Merci!

Répondre

3

Le dernier paramètre de MapViewOfFile (dwNumberOfBytesToMap) doit être inférieur à la taille maximale spécifiée lors de la création du mappage. Puisque nous ne savons pas quelle est cette taille, il semble juste de supposer que BUF_SIZE le dépasse et que 1024 ne l'est pas. La spécification de 0 pour ce paramètre est un moyen facile de mapper le fichier entier en une seule vue. La plupart (tous?) Débogueurs C++ supposeront qu'un pointeur vers char est une chaîne terminée par zéro, ainsi quand vous essayez et visualisez les données mappées il montrera seulement jusqu'au premier byte qui est zéro. En fonction des données contenues dans le mappage de fichier, cela pourrait bien être le deuxième octet, ce qui explique pourquoi vous ne voyez pas beaucoup d'informations. Vous feriez mieux de convertir le pointeur renvoyé en STATUS_DATA * et en affichant les membres individuels.

En bref:

  • Spécifiez zéro (0) pour dwNumberOfBytesToMap
  • Cast le pointeur retourné à STATUS_DATA * au lieu de unsigned char *
+0

C'est, je vous remercie! – rdoubleui

Questions connexes