tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル共有メモリの使い方
記事No11337
投稿日: 2008/02/05(Tue) 19:25
投稿者ダリア
はじめまして。
大変困っており、投稿させていただきます。

実は、C言語(システム側)とVB6(ユーザー側)でプログラムを作成しています。お互いに必要なデータは共有メモリで処理しようということになりました。私は、VB側を担当しています。
共有メモリは構造体とし、(その構造体に入れる)お互いの処理結果やデータの内容までは詰めたのですが。
VB初心者の私には共有メモリのアクセスの仕方が分かりませんでした。

そこで、ネットで調べましたところ、共有メモリの使い方には色々あるそうですが、CreateFileMappingを使うのが簡単でしょう、とのことらしいです。
確かに、複数のプロセスの間でメモリ内のデータが共有できるようです。
しかし、このCreateFileMappingを使う方法が簡単な方法とは、私には思えません。APIを使用することも、初心者の私には処理が怖い気がいたします。

私の検索が悪かったのでしょうが、他の方法を探すことが出来ず。
もし、他に良い方法がありましたらご教授お願いいたします。
また、CreateFileMappingのVB6にて解説しているサイトがありましたら教えていただけると大変嬉しく思います。(いくつかサイトを見てみたのと、MSDNライブラリは確認したのですが、いまいち理解できていないものでして、申し訳ありません)

[ツリー表示へ]
タイトルRe: 共有メモリの使い方
記事No11339
投稿日: 2008/02/05(Tue) 21:34
投稿者魔界の仮面弁士
> もし、他に良い方法がありましたらご教授お願いいたします。

良いかどうかの判断は置いといて、プロセス間データ通信で使えそうな方法としては:

・コマンドライン引数を使う
  →実装は非常に楽だが、起動時に一方通行的にデータを渡すことしかできない。
・クリップボード
  →実装は楽だが、OS全体で共有される物なので、通信には不向き。
・ファイル経由でデータ交換
  →実装は楽。通信後にデータファイルの後始末が必要。
   同時アクセス時の競合制御に注意。
・メモリマップドファイル
  →今回のAPIを使用。9x系とNT系の差異もあるので、ある程度の基礎知識は必要。
   物理ファイル時と同様に、同時アクセス時の競合には注意。
・レジストリでデータ交換
  →Appオブジェクト経由で保存できるエリアを使う分には、VB側の実装は非常に簡単。
   揮発性キーを使うのであれば、API による制御が必要。
・データベース経由で交換
  →実装は比較的楽。環境構築に多少の手間が必要。
・DDE 通信
  →VB側の実装は楽。通信エラー時の対策を考える必要あり。
・ActiveX EXE / ActiveX DLL
  →実装は少々手間。VB側の利用は楽。
   バイナリ互換性を維持する必要があるので、バージョン管理を確実に。
・C 側を DLL 化し、外部関数として公開
  →VB側が親アプリとなる必要がある。両方を独立したアプリにはできない。


> また、CreateFileMappingのVB6にて解説しているサイトがありましたら教えていただけると大変嬉しく思います。
>(いくつかサイトを見てみたのと、MSDNライブラリは確認したのですが、いまいち理解できていないものでして、申し訳ありません)
どこまで分かっていて、どこが分からないのかを断片的にでも書いてもらわないと、
アドバイスのしようがありません…。(^^;

もし何も分からないのであれば、せめて参考にしたサイトだけでも列挙されては如何でしょう。
さもないと、すでにご存知のサイトを再紹介される可能性がありますよね。

あと、勉強するのであれば「VB6にて」という制限をつけて探すのは止めた方が良いかと。
うまくVB6向けのサイトがあれば良いですが、そう都合よく見つからない場合もあるので、
まずは他の言語でも良いので、とにかく解説されているサイトを見つけ、API そのものの
使い方や仕様を学んでおくことをお奨めします。(今回の件に限らず)

[ツリー表示へ]
タイトルRe^2: 共有メモリの使い方
記事No11341
投稿日: 2008/02/06(Wed) 10:47
投稿者ダリア
魔界の仮面弁士様。
早速のお返事ありがとうございます。
他にも色々と方法があるのですね。Cの担当者と相談しようと思います。


> どこまで分かっていて、どこが分からないのかを断片的にでも書いてもらわないと、
> アドバイスのしようがありません…。(^^;
>
> もし何も分からないのであれば、せめて参考にしたサイトだけでも列挙されては如何でしょう。
> さもないと、すでにご存知のサイトを再紹介される可能性がありますよね。
>
> あと、勉強するのであれば「VB6にて」という制限をつけて探すのは止めた方が良いかと。
> うまくVB6向けのサイトがあれば良いですが、そう都合よく見つからない場合もあるので、
> まずは他の言語でも良いので、とにかく解説されているサイトを見つけ、API そのものの
> 使い方や仕様を学んでおくことをお奨めします。(今回の件に限らず)

アドバイスありがとうございます。
初歩的な疑問で申し訳ありませんが、具体的に行き詰っているところを書き込ませていただきます。

参考にしたサイト
http://athomejp.com/goldfish/api/sharedmemory.asp (Cでの解説)
http://yokohama.cool.ne.jp/chokuto/urawaza/index.html (HSP?での解説)
上記サイトの解説は大変参考になりました。
ただ、プログラムはさっぱりでした。HSPが何なのかさえ知りませんでしたので。
http://www.winapi-database.com/File/FileMapping/index.html
(VB5-6、VB.NETならびにCでの関数ごとの解説)
http://wisdom.sakura.ne.jp/system/winapi/win32/win150.html (Cでの解説)


メモリマップトファイルにて大きな疑問点は以下の二つです。
1.構造体が複数個存在し各々のサイズが異なる場合。ファイルマッピングオブジェクトの作成時(CreateFileMapping関数の使用時)にそれぞれ構造体ごとに作成してよろしいのでしょうか?
オブジェクト名を入力することと、サイズが異なることから各々作成しなければいけないような気がするのですが。
(参考にしたプログラムサンプルが構造体1つだったので、複数個になった場合がよく分かりませんでした)
2.また、ある構造体のアドレスをどのように知れば良いのかが、疑問です。
ある特定の(指定したと言うべきかもしれませんが)構造体のアドレスを知りたい場合、以下のようにMapViewOfFileを用いて、その返り値(ビューの開始アドレスが返るのですが)から、アドレスを得る。というのは、考え方として正しいですか?

        lpFileMap = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0&, 0&, 0&)
        
    lpFileMap:ある特定の構造体の先頭アドレスが入る変数
    hFileMap:CreateFileMappingの返り値(ファイルマッピングオブジェクトのハンドル)
    FILE_MAP_ALL_ACCESS:dwDesiredAccessパラメータとして、FILE_MAP_ALL_ACCESS変数で設定済み
    dwFileOffsetHighパラメータ、dwFileOffsetLowパラメータ、dwNumberOfByteToMapパラメータは各々0を指定して全体をマッピングする。

加えて、気をつけなければいけないことは。
1.ポインタ受け渡しのために、VB6で擬似的にポインタを代用しなければならない
2.オーバーフローすると落ちてしまう?指定したサイズ以上のデータを入れてはいけない。

API関数を使うことは初めてで、的外れなところがあるかもしれませんが。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: 共有メモリの使い方
記事No11342
投稿日: 2008/02/06(Wed) 14:08
投稿者
提案ですのでスルーされてもかまいません.悪しからず//

・TCP/IPでローカルで接続.
 ・構造体の配置がわかっている場合は簡単に通信できるかもしれません.

です.

[ツリー表示へ]
タイトルRe: 共有メモリの使い方
記事No11345
投稿日: 2008/02/06(Wed) 17:05
投稿者K.J.K.
昔、他の掲示板での質問の
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200409/04090088.txt
への返答で作ったサンプルならば、今でもそのまま置いてあります。
但し、ここでは、高速なファイルの読み書きの手段としてのみ使っていますので、
プロセス間通信に使うにはそれなりの変更が必要でしょう。

[ツリー表示へ]
タイトルありがとうございました
記事No11351
投稿日: 2008/02/08(Fri) 11:03
投稿者ダリア
も様
提案ありがとうございます。

K.J.K様
すみません。
ご指定いただいたサイトへ飛ぶことが出来ませんでした。
会社のサイト制限に引っかかっているみたいです。
(最近、制限が厳しいようで、プログラムのダウンロードも制限がかかっています)
せっかく情報頂きましたのに申し訳ありません。


ただ今、Cの担当者が出張中でして。
上の指示もあり、ひとまず、メモリマップトファイルで検討を行おうと思います。
(自身の勉強にもなりますので)
皆々様、ご回答ありがとうございました。
当初の質問が共有メモリのアクセス方法ということでお願いいたしましたので、メモリマップトファイルに関する詳細な質問については別途、改めてご質問させていただいたほうがよろしいかと思います。
(管理人様、別途、改めてご質問で正しいのか否か私には判断が付きがたいところがありますが。不適切でしたら、その旨ご連絡いただけると嬉しいです。)

このたびは、本当にありがとうございました。

[ツリー表示へ]