0

我有两个过程。在进程 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,请参阅: 查看 pBuf 的 Microsoft Visual Studio Arbeitsspeicher

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;
} 
4

1 回答 1

2

是的,你肯定有类型不匹配。该文件不太可能包含正确的以零结尾的 C 字符串。使用 TCHAR 宏增加了随机性,不再使用它们没有意义。Windows 的最后一个非 Unicode 版本于 10 年前死去。

回答问题:使用 Debug + Windows + Memory + Memory 1 并将“pBuf”放入地址框中。您将看到共享内存内容的原始十六进制转储。

于 2013-10-26T12:10:34.287 回答