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>");
行、 MapViewOfFile
ではなく lpMapAddress
が必要でした。または、正確には(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 、特にメモリマッピングのセクション。
所属していません StackOverflow