アプリケーションが共有メモリを介して提供するステータス情報を読みたい。その名前付き共有メモリのコンテンツを読み取り、C#クラスからpinvokeで呼び出すために、C++を使用したいと思います。
ソフトウェアから、私はそれが特定のファイル構造を持っていることを知っています:STATUS_DATA
の4つの構造体の配列を持つ構造体SYSTEM_CHARACTERISTICS
。
私は(まだ)C ++に精通していないので、基本的にmsdnをフォローしようとしました。マップするファイルのサイズを見つけるために、以下のコードに示されているように、構造体メンバーのサイズを追加しました。これにより、アクセスが拒否されたため、構造体に基づく結果が高すぎると考えました。使用するとsizeof(STATUS_DATA)
(ソースに構造体を追加しました)、それでもACCESSDENIEDになります。1024バイトなど、もっと低いものを試してみると、デバッグ中に表示されるpbuf
のは、だけです。<
これは私がこれまでに得たものです:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
#pragma comment(lib, "user32.lib")
using namespace std;
signed int BUF_SIZE = 4 * (10368 + 16 + 4 + 16 + 4 + 16 + 4 + 1 + 4); // sizeof(STATUS_DATA);
TCHAR szName[]=TEXT("ENGINE_STATUS");
int main()
{
HANDLE hMapFile;
unsigned char* pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_READ, // read access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (unsigned char*) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_READ, // read/write permission
0,
0,
BUF_SIZE); // 1024);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
また、そのヒントに従うことで、この共有メモリが「存在する」ことを確認しました。誰かが私にヒントを教えてもらえますか、私が欠けているものは何ですか?ありがとう!