共有メモリに関するDLLを作成し、プロセスAとプロセスBで使用します
//Samle.dll
long SampleClass::Create()
{
//共有メモリを作成
m_handle = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE, // 読書き両方にする
0,
100,
"test"// 共有メモリ名を設定
);
// マッピング開始
m_adress = (INFO_DATA *)MapViewOfFile(
m_handle,
FILE_MAP_ALL_ACCESS, // 読書き両方
0,
0,
100);
if(m_adress == NULL)
{
return -1;
}
m_adress->headerinfo.size = 100;
m_adress->lineinfo = (LINE_INFO*)( (DWORD)m_adress +sizeof(HEADER_INFO) );
return 0;
}
long SampleClass::Open()
{
m_handle = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
"test");
if(m_handle == NULL)
{
return -1;
}
HEADER_INFO* h = (HEADER_INFO *)MapViewOfFile(m_handle,
FILE_MAP_ALL_ACCESS, // 読書き両方
0,
0,
sizeof(HEADER_INFO));
// マッピング開始
m_adress = (INFO_DATA *)MapViewOfFile(m_handle,
FILE_MAP_ALL_ACCESS, // 読書き両方
0,
0,
h->size);
if(m_adress == NULL)
{
return -1;
}
return 0;
}
long SampleClass::Destroy()
{
if( ( m_adress == NULL ) || ( m_handle == NULL ) )
{
return -1;
}
//マッピング解除
UnmapViewOfFile(m_adress);
//ハンドル閉じ
CloseHandle(m_handle);
m_handle = NULL;
return 0;
}
void SampleClass::Write(char* str)
{
m_adress->lineinfo->lineNumber = 1;
strcpy_s(m_adress->lineinfo->strData, str);
}
INFO_DATA* SampleClass::GetData()
{
return m_adress;
}
順序として
①プロセスAで共有メモリ作成
//プロセスA
SampleClass s;
void CSampleADlg::OnBnClickedButton1()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
s.Create();//①
}
②プロセスBで共有メモリオープン
③プロセスBで共有メモリに書き込み
//プロセスB
SampleClass s;
void CSampleBDlg::OnBnClickedButton1()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
s.Open();//②
s.Write("hello");//③
}
④プロセスAでデータの確認
void CSampleADlg::OnBnClickedButton2()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
INFO_DATA * info = s.GetData();
}
この手順で確認したところ文字列が入っておりませんでした。
何故共有されないのでしょうか?