共有メモリへのアクセス及び値渡しについて


toshi  2010-10-20 09:15:22  No: 71976  IP: [192.*.*.*]

質問させていただきます。よろしくお願いします。
開発環境は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;
}

編集 削除
maru  2010-10-20 15:56:32  No: 71977  IP: [192.*.*.*]

何がわからないのですか?
MSDNをみているならそれぞれの関数を調べて、その引数から何をやっているかわかると思います。
1.CreateFileMapping()でメモリマップファイルを作成
2.MapViewOfFile()でそのファイルをメモリにマップ
3.CopyMemory()でそのメモリにデータ(用意された文字列)をコピー
4.UnmapViewOfFile()でメモリのアンマップ
5.CloseHandle()でファイルクローズ
そのまんまですけど。

> 任意の共有メモリに1を渡すプログラム
「任意」とはどこでもいいということですか?
共有メモリを言うからには他のプロセスを授受したいのだと思いますがその辺をもっと具体的にしたほうがよいと思います。
「1]というのがintの1ならpBufをint*でキャストして
*(int*)pBuf = 1;
とでもすればいいのかな。

編集 削除
toshi  2010-10-20 16:19:21  No: 71978  IP: [192.*.*.*]

質問の仕方が適切でなく申し訳ありません。

> 任意の共有メモリに1を渡すプログラム
この「任意の」という言い方が適切ではなかったのですが、今回作成するプログラムでは別のソフトによって作成された共有メモリにアクセスする必要があるため、それが可能かどうかをお聞きしたかったのです。

分かりづらい表現ですいません。

編集 削除
maru  2010-10-20 17:44:22  No: 71979  IP: [192.*.*.*]

で、何がわからないのですか?

Google君に「共有メモリ」でお伺いをたててみたら、すぐに動作検証できそうなものがいくつもヒットした。
そのひとつを紹介。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_FileMapping.html

> 任意の共有メモリに1を渡すプログラム
は最初のプログラムの
3.CopyMemory()でそのメモリにデータ(用意された文字列)をコピー
の部分を
*(int*)pBuf = 1;
とすれが実現できそうなんだけど。

まあ、共有メモリを使う場合は紹介したURLにも書いてある通り同期の問題があってちょっと厄介なんだけどね。

編集 削除
toshi  2010-10-20 18:07:44  No: 71980  IP: [192.*.*.*]

分からないことというのは、ほかのソフトによって作成された共有メモリにアクセスする際にどのようなことをすればいいのかということです。

>3.CopyMemory()でそのメモリにデータ(用意された文字列)をコピー
>の部分を
>*(int*)pBuf = 1;
>とすれが実現できそうなんだけど。

そのまま試してみたところ、error C2664が出ました。私の記述が間違っているのでしょうか。

編集 削除
maru  2010-10-20 20:28:27  No: 71981  IP: [192.*.*.*]

> 分からないことというのは、ほかのソフトによって作成された共有メモリにアクセスする際にどのようなことをすればいいのかということです。

それは、そのほかのソフトがどうやって共有メモリを作成しているかによるでしょう。
それが分からないと何とも答えなようがないんですけど。

> そのまま試してみたところ、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;

これくらいでいいかな。

編集 削除
toshi  2010-10-21 09:24:34  No: 71982  IP: [192.*.*.*]

>それは、そのほかのソフトがどうやって共有メモリを作成しているかによる>でしょう。
>それが分からないと何とも答えなようがないんですけど。

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;
ありがとうございます。これを参考にがんばってみます。

編集 削除
maru  2010-10-26 10:40:57  No: 71983  IP: [192.*.*.*]

ScreenWorksってこれかな?
http://www.mee.co.jp/sales/fa/epc/ScreenWorks.html

確かに「共有メモリを持っているため、他アプリケーションとのデータ送受信が可能」と書いてあるけど、
「(共有メモリの利用には、ScreenWorks開発キットが必要)」とも書いてますね。
開発キットに共有メモリへのアクセス方法が書いてあると思います。

ScreenWorksがこれでなかったらごめんなさい。

編集 削除