0

私は2つのプロセスを得ました。プロセス A では、アプリケーション Alpha が共有メモリを使用する準備ができています。プロセス B では、main メソッドを使用する Windows コンソール アプリケーションがこの共有メモリにアクセスします。動作します。メモリに接続できます。残念ながら、メモリの内容を変数 (ここでは pBuf) に格納し、MsVisualStudioDebugger を介して変数を調べると、バッファには 1 文字しかありません。何が問題なのですか? メモリ/ファイルを調べて、メモリに格納されているオブジェクトを知るにはどうすればよいですか? 前もって感謝します。

これが私のコンソールアプリのコードです:

#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() 関数の戻り値のキャストにあると思います。

更新-2: ありがとうハンス!pBuf の内容を 16 進ダンプとして見ることができました。以下を参照してください。 pBuf の Microsoft Visual Studio Arbeitsspeicher を表示

更新-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 年前に消滅しました。

質問への回答: デバッグ + Windows + メモリ + メモリ 1 を使用し、[アドレス] ボックスに「pBuf」を入力します。共有メモリ コンテンツの生の 16 進ダンプが表示されます。

于 2013-10-26T12:10:34.287 に答える