كيف يمكنني الكتابة إلى الذاكرة المشتركة في C ++؟
-
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 ، في قسم على تعيين ذاكرة على وجه الخصوص.