Я хочу прочитать информацию о состоянии, которую приложение предоставляет через общую память. Я хочу использовать C ++ для чтения содержимого этой именованной разделяемой памяти, а затем вызвать его с помощью pinvoke из C # -класса.
Из программного обеспечения я знаю, что оно имеет определенную файловую структуру: структура STATUS_DATA
с массивом из четырех структур SYSTEM_CHARACTERISTICS
.
Я (пока) не знаком с C ++, поэтому я пытался в основном следовать msdn. Чтобы найти размер отображаемого файла, я добавил размеры членов структуры, как показано в приведенном ниже коде. Это приводит к отказу в доступе, поэтому я решил, что результат, основанный на структурах, слишком высок. Когда я использую sizeof(STATUS_DATA)
(я добавил структуру к своему источнику), она все равно заканчивается ACCESS DENIED. Если я попробую что-нибудь меньшее, например, 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;
}
Я также удостоверился, что этот Общий Мем "есть", следуя этому подсказке . Может кто-нибудь дать мне подсказку, чего мне не хватает? Спасибо!