我有两个过程。在进程 A 中,应用程序 Alpha 准备好使用共享内存。在进程 B 中,我的 Windows 控制台应用程序使用 main 方法访问此共享内存。它有效,我可以连接到内存。不幸的是,如果我将内存内容存储在一个变量(此处为 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;
}
更新:在对这个问题进行了更多研究之后,我猜问题是 MapViewOfFile() 函数的返回值的转换。
UPDATE-2:谢谢汉斯!我能够将 pBuf 内容视为 hexdump,请参阅:
UPDATE-3:谢谢汉斯!根据您的建议,我能够使用 fwrite() 将共享内存内容放入本地计算机上的文件中。此外,我还可以看到一些熟悉的名称,例如我在 application-Alpha 中配置的 EingangMotor1 之类的名称,并且该内容似乎存储在共享内存中。现在我希望使用 application-Alpha,识别共享内存中的相关更改,然后希望我能够更改共享内存变量值的值,因此 application-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;
}