كيف يمكنني الكتابة إلى الذاكرة المشتركة في C ++؟

StackOverflow https://stackoverflow.com/questions/1423031

  •  07-07-2019
  •  | 
  •  

سؤال

وأود أن أكتب الذاكرة المشتركة ومن ثم تفريغ محتويات ملف في Win32 API. حاليا لدي هذا الرمز:

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

ولكن، خط 31 (الدعوة sprintf) يعطي الخطأ:

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

ولقد حاول صب lpMapAddress إلى LPTSTR، لكنه لا يملك أي تأثير. ما الخطأ الذي افعله؟ أو هل هناك طريقة أفضل للقيام بذلك؟

هل كانت مفيدة؟

المحلول

في

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

والخط، والتي أراد lpMapAddress، وليس MapViewOfFile. أو (char*)lpMapAddress على وجه الدقة.

نصائح أخرى

وأنت تحاول الكتابة إلى ملف منتظم. الكتابة إلى الذاكرة المشتركة يجب أن تمر INVALID_HANDLE_VALUE إلى CreateFileMapping. تحقق من هذه المقالة لمزيد من التفاصيل.

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

في sprintf يتم تمرير عنوان MapViewOfFile وظيفة. وبدلا من ذلك يجب عليك تمرير عنوان الذاكرة المعين.

وردا على "هل هناك طريقة أفضل للقيام بذلك؟": ألق نظرة على الموقع Boost.Interprocess ، في قسم على تعيين ذاكرة على وجه الخصوص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top