mmfctrl_mod.as
ver 0.04 module (99/11/14)

A module script to use common memory in HSP with loadlib.dll...

戻る

このスクリプトは?

  • このスクリプトはWindowsの「メモリマップトファイル」という機能をTomさん作の loadlib.dll を使って呼び出し、HSPで共有メモリもどきを実現するためのモジュールスクリプトです。
  • このモジュールを用いると、スクリプト間で共有メモリを使った情報のやりとりが可能となります。
  • また、このモジュールの命令は拙作の mmfctrl.dll と互換性があり、mmfctrl.dllをお使い方は#include命令のmmfctrl.asmmfctrl_mod.as に差し替えるだけで使用できますが、バグ修正を含む多少の変更点があります。
  • HSPのスクリプトで記述されているのでDLLと比べて各自が自由にカスタマイズできます。
  • このスクリプトはフリーで無保証です。使用・改造・添付など御自由にお使いいただけますが、 トラブルには対応できないので各自の責任の下で行なって下さい。

▲top

動作環境

▲top

ダウンロード

mmfctrl_mod.as v0.04 (99/11/14)
LZH圧縮ファイル(14KB)
ソース付き

Download

 

▲top

ファイル構成

mmfctrl_mod.as モジュールスクリプト
sample.as サンプルスクリプト
index.html このドキュメント
mmfctrl.hs mmfctrl.dll互換命令用HSP Help Tools ヘルプソース
mmfctrl_low.hs 低レベルmmfctrl命令群 ファイル-マッピングオブジェクト操作命令用HSP Help Tools ヘルプソース

▲top

インストール

インストーラーは付属していないので手動でインストールしてください。アーカイブに含まれているファイル全てを展開し、mmfctrl_mod.as をHSPのcommonフォルダにコピーして下さい。
また、当モジュールはTomさん作のloadlib.dll が必要です。もし、インストールしていなければHSPホームページにある「機能拡張ソフト紹介」のページからダウンロードしてインストールしてください。当モジュールを使用したスクリプトを実行させるためには、loadlib.dll HSPのフォルダに、loadlib.asがスクリプトと同じフォルダかHSPのcommonフォルダに存在している必要があります。

▲top

アンインストール

モジュールスクリプトを削除してください。レジストリは使用しないのでご安心を。(^^;)

▲top

使用方法(mmfctrl.dll互換命令)

スクリプトの先頭に

#include "mmfctrl_mod.as"

という行を追加 することによって、以下の命令が使えるようになります。
モジュール名は全て mmfctrl です。

命令およびその機能
mmfwrite 共有メモリを作成しデータを書き込む
mmfread 共有メモリからデータを読み出す
mmfdecon 共有メモリを破棄する
Commands

mmfwrite - 共有メモリを作成しデータを書き込む
mmfwrite p1,p2,p3

p1  書き込むデータが格納されている変数名
p2  書き込む共有メモリにつける名前
p3  書き込むデータの大きさ(Bytes)

[解説]

共有メモリを作成し、そこにp1の内容をp3バイト書き込みます。 また、作られた共有メモリにはp2で指定される名前が付けられます。 既にp2と名付けられた共有メモリが存在している場合は上書きされます。

[DLLバージョンからの変更点]
p3を省略してもエラーにならず、p1の内容を文字列とみなして'\0'(ヌル文字)までを書き込みます。
mmfreadで共有メモリからデータを読み出す場合にその名前が必要となります。
p2に指定する名前を変えることによって複数の共有メモリを作成できます。
名前は255文字までとし、1つのスクリプト内で同時に使用できる共有メモリは256個までです。 (同時使用個数の制限はモジュールスクリプトを修正することによって変更可能)
成功するとstatに0を返し、失敗するとstatに1を返します。

[サンプル]

datawr="書き込むデータ" ;書き込むデータ
name="mmfData" ;共有メモリ名
strlen a,dataw ;書き込むサイズを得る
mmfread datawr,name,a ;共有メモリに書き込む
if stat : dialog "失敗!"
mmfwrite

mmfread - 共有メモリからデータを読み出す
mmfread p1,p2,p3

p1  読み出したデータを格納する変数名
p2  読み出す共有メモリの名前
p3  読み出すバイト数[NEW]

[解説]

[DLLバージョンからの変更点]
パラメータp3が追加。省略すると従来どおりの動作です。

mmfwrite で書き込んだ共有メモリからデータをp3バイト読み出しp1で指定された変数に格納します。
p2に指定する共有メモリの名前はmmfwriteで指定した名前と同一でなければなりません。 また、p1にはmmfwriteで書き込んだバイト数が入るだけの領域があらかじめ確保されている必要があります。
p2に指定する名前を変えることによって複数の共有メモリから読み出しができます。
p3は、省略すると共有メモリの内容を文字列とみなして'\0'(ヌル文字)までを読み込みます。(DLL版と同じ動作) これまでのバージョンでは読み出すデータに'\0'があるとそこで読み出しを終了していたために、 バイナリーデータを扱う場合にバグとなっていましたが、p3にバイト数を指定することによって解決されます。
成功するとstatに0を返し、失敗するとstatに1を返します。

[サンプル]

sdim datard,256 ;読み込み用のメモリ確保
name="mmfData" ;共有メモリ名
mmfread datard,name ;共有メモリから読み込む('\0'まで)
if stat : dialog "失敗!"
mmfread

mmfdecon - 共有メモリを破棄する
mmfdecon

[解説]

そのプロセスが今までにmmfwriteやmmfreadで操作した全ての共有メモリを破棄します。

[DLLバージョンからの変更点]
DLL版では自動的にこの命令は実行されましたが、モジュール版ではこの命令を実行させるためにはスクリプト中 に記述する必要があります。
通常はプロセスの終了と共に共有メモリは解放されるので、DLL版と同じく明示的に使用する必要はないのですが、 念のためにonexitなどで終了をトラップして実行すると安心です。
また、システム変数statに戻り値を返し、成功するとstatに0を、失敗するとstatに1を返します。

また、この命令が実行されても他のプロセスが共有メモリを使用中であれば、破棄されません。 過去に共有メモリに対してアクセスをした全てのプロセスが、共有メモリを破棄した状態。 つまり共有メモリに対してmmfreadもしくはmmfwriteを行なったプロセス数が0の状態になって初めて、その共有メモリは 完全に破棄されます。

mmfdecon

▲top

低レベルmmfctrl命令群 〜ファイル-マッピングオフジェクト操作命令〜

この命令群は、Loadlib.dllの使用に伴ない、API関数の呼出し機能毎に「低レベルmmfctrl命令群」として作成した命令です。
これらの命令は通常使用する必要は全くありません。上級者がモジュールの改造や解析をする際の参考にしてください。
これら命令群の説明はここでは割愛させていただきます。詳しくはHSP Help Tools用ヘルプ、またはモジュールスクリプト内の 注釈表示を見てください。
命令およびその機能
mmfCreateFileMapping API関数CreateFileMappingの呼出し
mmfOpenFileMappingA API関数OpenFileMappingAの呼出し
mmfMapViewOfFile API関数MapViewOfFileの呼出し
mmfUnmapViewOfFile API関数UnmapViewOfFileの呼出し
mmfCloseHandle API関数CloseHandleの呼出し
Low level Commands

▲top

注 意

このプログラムはフリーで無保証です。よって、このプログラムを使用して発生した、いかなる損害も保証いたしません。使用・添付・改造は 自由に行ってくださって結構です。再配布・転載もご自由に。でも、オリジナルの著作権は だてしむ にあるので、改造モノ単体でネットに 流すときとかはオリジナルと区別できるような配慮をお願いします。m(_ _)m
あと、添付の際はドキュメント付加の必要はありません。だって、こんなドキュメントって配布には邪魔になっちゃうからね。(^^;)

▲top

改訂履歴

ver 0.04 module 初のモジュール版。やっぱり0.03にバグが残ってましたね。(^^;)バイナリもこれで大丈夫です。
ver 0.03 (dll) バグが無いようなのでこのまま正式版。HSヘルプ付加
ver 0.02β (dll) ハンドル取得に関するメモリリーク(?)バグを修正。
ver 0.01 (dll) 恐る恐る公開(^^;

▲top

最後に

相変わらず3命令ですが、バグの発覚とモジュールへの移行に伴って今回、多少の修正が入りました。 新たなバグが紛れ込んでないか、おっちょこちょいな性格故にちょっと不安です。(^^;)
また、モジュール化とLoadlib.dllの使用とが絡んだために、今回新しく共有メモリの「低レベル」命令群としてAPIの関数毎に命令を 作ってみましたが、こちらは上級者用なのでここでは割愛しました。モジュールスクリプト内とHSP Help Tool用のソースにコマゴマと 書いてあるので興味のある方は見てみてください。もちろん、流用・改造もお気に召すままどうぞ。
あと、今回初めて「loadlib.dll」と「モジュール」を使ってみたのですが、とても面白くて興味が尽きない 機能でした。これからHSPがもっと面白くなる・・と実感した次第です。(^^)
HDDが飛んでDLL版のソースが無い状態(;_;)なので、DLL版はこのモジュールルーチンを元に作る予定ですが・・ モジュールを公開しちゃったから、もうDLL版作ってもあまり意味が無いかなぁ・・って。(笑) だって、こんなマニアな命令使うほどの人なら、自分で勝手にモジュールを改造できちゃうだろうしなぁ・・。(^^;)
とにかく、最後の最後に・・・恒例ながら(汗)、バグ・要望等があれば、報告していただければ幸いです。

▲top

一次配布元および連絡先

だてしむソフトウエア開発局 http://www.mynet.ne.jp/~simodate/

E-mail : simodate@mail.mynet.ne.jp (だてしむ)