У меня два процесса. В процессе A приложение Alpha готово для использования разделяемой памяти. В процессе B мое оконное приложение с основным методом обращается к этой общей памяти. Он работает, я могу подключиться к памяти. К сожалению, если я храню содержимое памяти в переменной (здесь pBuf) и проверяю переменную через MsVisualStudioDebugger, в буфере есть только одна буква - что пошло не так? Как я могу смотреть в память/файл, чтобы получить ключ, какие объекты хранятся в памяти? Заранее спасибо.
Вот код моего консольного приложения:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
using namespace std;
#define BUF_SIZE 256
TCHAR szName[] = TEXT("SIMITSHM"); // Name des SHMs;
int main(void){
std::cout << "*** start SharedMemory ***\n";
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
if (hMapFile == NULL){
MessageBox(NULL, TEXT("Could not open file mapping object"), TEXT("FEHLER"), MB_OK);
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
if (pBuf == NULL){
MessageBox(NULL, TEXT("Could not map view of file"), TEXT("FEHLER"), MB_OK);
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("SIMIT-SHM"), MB_OK); // content of memory
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
std::cout << "*** close app by typing a number. ***\n";
int a = 0;
cin >> a;
return 0;
}
UPDATE: после проведения дополнительных исследований по этой проблеме, я думаю, проблема заключается в отливке возвращаемого значения MapViewOfFile() -function.
ОБНОВЛЕНИЕ-2: Спасибо, Ханс! Я смог посмотреть содержимое pBuf как hexdump, см.:
ОБНОВЛЕНИЕ-3: Спасибо, Ханс! Благодаря вашим советам я смог использовать fwrite() для размещения содержимого общей памяти в файле на моей локальной машине. Более того, я могу видеть знакомые имена, такие как EingangMotor1, которые я настроил в приложении-Alpha, и кажется, что этот контент хранился в общей памяти. Теперь я надеюсь поиграть с приложением-Alpha, узнаю связанные изменения в общей памяти, а потом надеюсь, что я смогу изменить значения значений переменных разделяемой памяти, поэтому приложение-Alpha изменит свое поведение на лету.
UPDATE-4: текущий код - заблаговременно заблаговременно за отзыв, какие линии необходимо улучшить.
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <strsafe.h>
#include <fstream>
#include <sstream>
#include <vector>
#pragma comment(lib, "user32.lib")
using namespace std;
#define BUF_SIZE 256
TCHAR szName[] = TEXT("SIMITSHM"); // Name des SHMs;
int main(void){
std::cout << "*** Start SharedMemory ***\n";
HANDLE hMapFile;
FILE * pBuf;
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
if (hMapFile == NULL){
MessageBox(NULL, TEXT("Could not open file mapping object"), TEXT("ERROR"), MB_OK);
return 1;
}
// MapViewOfFile return a pointer to void, so you need to cast it to a suitable structure
pBuf = (FILE*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
if (pBuf == NULL){
MessageBox(NULL, TEXT("Could not map view of file"), TEXT("ERROR"), MB_OK);
CloseHandle(hMapFile);
return 1;
}
// write file
FILE * pFile;
pFile = fopen ("shm-main-simit-content-fwrite.txt","w");
fwrite(pBuf, 50, 20, pFile);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
std::cout << "*** close app by typing a number. ***\n";
int a = 0;
cin >> a;
return 0;
}
Да, у вас, конечно, есть несоответствие типа. Этот файл вряд ли содержит корректную нуль-строку C. Использование макросов TCHAR добавляет к случайности, больше нет смысла их использовать. Последняя версия Unicode для Windows умерла 10 лет назад.
Отвечая на вопрос: используйте Debug + Windows + Memory + Memory 1 и поместите "pBuf" в поле "Адрес". Вы увидите шестнадцатеричный дамп содержимого разделяемой памяти.