2009-09-14 14 views
0

Je voudrais écrire dans la mémoire partagée, puis vider le contenu dans un fichier dans l'API win32. Actuellement, j'ai ce code:Comment écrire dans la mémoire partagée en C++?

HANDLE hFile, hMapFile; 
    LPVOID lpMapAddress; 

    hFile = CreateFile("input.map", 
    GENERIC_READ | GENERIC_WRITE, 
    0, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, 
    NULL); 

    hMapFile = CreateFileMapping(hFile, 
    NULL, 
    PAGE_READWRITE, 
    0, 
    0, 
    TEXT("SharedObject")); 

    lpMapAddress = MapViewOfFile(hMapFile, 
    FILE_MAP_ALL_ACCESS, 
    0, 
    0, 
    0); 

    sprintf(MapViewOfFile, "<output 1>"); 

    UnmapViewOfFile(lpMapAddress); 
    CloseHandle(hFile); 
    CloseHandle(hMapFile); 

Cependant, la ligne 31 (appel sprintf) donne l'erreur:

error: cannot convert `void*(*)(void*, DWORD, DWORD, DWORD, DWORD)' 
to `char*' for argument `1' to `int sprintf(char*, const char*, ...)' 

J'ai essayé casting le lpMapAddress à LPTSTR, mais il n'a pas d'effet. Qu'est-ce que je fais mal? Ou y a-t-il une meilleure façon de le faire?

Répondre

8

Dans le

sprintf(MapViewOfFile, "<output 1>"); 
ligne

, vous vouliez lpMapAddress, pas MapViewOfFile. Ou (char*)lpMapAddress pour être précis.

+0

Maintenant, je me sens stupide :) – pypmannetjies

1

Vous essayez d'écrire dans un fichier standard. Pour écrire dans la mémoire partagée, vous devez passer de INVALID_HANDLE_VALUE à CreateFileMapping. Consultez l'article this pour plus de détails.

TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); 
    HANDLE hMapFile; 
    PVOID pBuf; 
    const DWORD BUF_SIZE = 256; 

    hMapFile = CreateFileMapping(
       INVALID_HANDLE_VALUE, // use paging file 
       NULL,     // default security 
       PAGE_READWRITE,   // read/write access 
       0,      // max. object size 
       BUF_SIZE,    // buffer size 
       szName);     // name of mapping object 

    pBuf = MapViewOfFile(hMapFile, // handle to map object 
         FILE_MAP_ALL_ACCESS, // read/write permission 
         0,     
         0,     
         BUF_SIZE);   

    TCHAR szMsg[]=TEXT("<output 1>"); 
    CopyMemory(pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 

    UnmapViewOfFile(pBuf);  
    CloseHandle(hMapFile); 
0

Dans sprintf, vous transmettez l'adresse de la fonction MapViewOfFile. Au lieu de cela, vous devez passer l'adresse mémoire mappée.

Questions connexes