私は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 進ダンプとして見ることができました。以下を参照してください。
更新-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;
}