質問させていただきます。よろしくお願いします。
開発環境はWindows XP Visual Studio C++ 6.0です。
タイトルの通りの質問内容なのですが、MSDNからサンプルコードをコピーしてみたのですが、いまいち理解できませんでした。
任意の共有メモリに1を渡すプログラムを作成したいのですが、以下のソースのどこをいじり、何が足りないのかご指摘やアドバイスがありましたらお願いします。
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process.");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
何がわからないのですか?
MSDNをみているならそれぞれの関数を調べて、その引数から何をやっているかわかると思います。
1.CreateFileMapping()でメモリマップファイルを作成
2.MapViewOfFile()でそのファイルをメモリにマップ
3.CopyMemory()でそのメモリにデータ(用意された文字列)をコピー
4.UnmapViewOfFile()でメモリのアンマップ
5.CloseHandle()でファイルクローズ
そのまんまですけど。
> 任意の共有メモリに1を渡すプログラム
「任意」とはどこでもいいということですか?
共有メモリを言うからには他のプロセスを授受したいのだと思いますがその辺をもっと具体的にしたほうがよいと思います。
「1]というのがintの1ならpBufをint*でキャストして
*(int*)pBuf = 1;
とでもすればいいのかな。
質問の仕方が適切でなく申し訳ありません。
> 任意の共有メモリに1を渡すプログラム
この「任意の」という言い方が適切ではなかったのですが、今回作成するプログラムでは別のソフトによって作成された共有メモリにアクセスする必要があるため、それが可能かどうかをお聞きしたかったのです。
分かりづらい表現ですいません。
で、何がわからないのですか?
Google君に「共有メモリ」でお伺いをたててみたら、すぐに動作検証できそうなものがいくつもヒットした。
そのひとつを紹介。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_FileMapping.html
> 任意の共有メモリに1を渡すプログラム
は最初のプログラムの
3.CopyMemory()でそのメモリにデータ(用意された文字列)をコピー
の部分を
*(int*)pBuf = 1;
とすれが実現できそうなんだけど。
まあ、共有メモリを使う場合は紹介したURLにも書いてある通り同期の問題があってちょっと厄介なんだけどね。
分からないことというのは、ほかのソフトによって作成された共有メモリにアクセスする際にどのようなことをすればいいのかということです。
>3.CopyMemory()でそのメモリにデータ(用意された文字列)をコピー
>の部分を
>*(int*)pBuf = 1;
>とすれが実現できそうなんだけど。
そのまま試してみたところ、error C2664が出ました。私の記述が間違っているのでしょうか。
> 分からないことというのは、ほかのソフトによって作成された共有メモリにアクセスする際にどのようなことをすればいいのかということです。
それは、そのほかのソフトがどうやって共有メモリを作成しているかによるでしょう。
それが分からないと何とも答えなようがないんですけど。
> そのまま試してみたところ、error C2664が出ました。私の記述が間違っているのでしょうか。
それは失礼しました。
LPTSTRからint*への変換はエラー、確かにconstはずしになっちゃう。
LPCTSTR pBuf;
↓↓↓↓↓↓
int* pBuf;
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
↓↓↓↓↓↓
pBuf = (int*) MapViewOfFile(hMapFile, // handle to map object
*(int*)pBuf = 1;
↓↓↓↓↓↓
*pBuf = 1;
これくらいでいいかな。
>それは、そのほかのソフトがどうやって共有メモリを作成しているかによる>でしょう。
>それが分からないと何とも答えなようがないんですけど。
ScreenWorksというソフトにて作られるらしいのですがいまいちどんなものかわかっていません。申し訳ないです。
>それは失礼しました。
>LPTSTRからint*への変換はエラー、確かにconstはずしになっちゃう。
>LPCTSTR pBuf;
>↓↓↓↓↓↓
>int* pBuf;
> pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
>↓↓↓↓↓↓
> pBuf = (int*) MapViewOfFile(hMapFile, // handle to map object
>*(int*)pBuf = 1;
>↓↓↓↓↓↓
>*pBuf = 1;
ありがとうございます。これを参考にがんばってみます。
ScreenWorksってこれかな?
http://www.mee.co.jp/sales/fa/epc/ScreenWorks.html
確かに「共有メモリを持っているため、他アプリケーションとのデータ送受信が可能」と書いてあるけど、
「(共有メモリの利用には、ScreenWorks開発キットが必要)」とも書いてますね。
開発キットに共有メモリへのアクセス方法が書いてあると思います。
ScreenWorksがこれでなかったらごめんなさい。