Frage

würde Ich mag auf gemeinsam genutzten Speicher schreiben und dann den Inhalt in eine Datei in dem Win32-API-Dump. Zur Zeit habe ich diesen Code:

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);

Allerdings, Zeile 31 (der sprintf-Aufruf) gibt den Fehler:

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

Ich habe versucht, die lpMapAddress zu LPTSTR Gießen, aber es hat keine Wirkung. Was mache ich falsch? Oder gibt es einen besseren Weg, es zu tun?

War es hilfreich?

Lösung

In der

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

Linie, Sie wollten lpMapAddress, nicht MapViewOfFile. Oder (char*)lpMapAddress um genau zu sein.

Andere Tipps

Sie versuchen, auf eine normale Datei zu schreiben. Zum Schreiben in den gemeinsamen Speicher sollten Sie passieren INVALID_HANDLE_VALUE CreateFileMapping. Schauen Sie sich diesem Artikel für weitere Details.

   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);

In sprintf Sie übergeben die Adresse der Funktion MapViewOfFile. Stattdessen sollten Sie die abgebildete Speicheradresse übergeben.

Die Beantwortung der „Gibt es einen besseren Weg, es zu tun?“: Werfen Sie einen Blick auf Boost.Interprocess , die Abschnitt über die Speicherabbildung im besonderen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top