メモリ共有モジュール

同じパソコン内で起動している複数のアプリケーションでメモリを共有するためのモジュールです。

モジュールの使い方

下記のモジュールをスクリプトにコピペするだけで使用できます。
DLLやモジュールを別途用意する必要はありませんが、WindowsAPI(Win32API)を使用しますので環境に依存しています。
命令・関数名パラメータパラメータの説明
newmod array, MemoryMapModule, str, int
共有メモリを作成する
HSP標準命令を使用して共有メモリ用のモジュール変数を作成します。
array モジュール変数を作成する配列変数
(モジュール名)定義済みのモジュール名
str
任意文字列 (メモリを識別するための名前)
同じ名前を指定することで共有できる
intn [byte] (メモリサイズ)
(stat)
0 (失敗)
1 (成功 新規作成)
2 (成功 2回目以降の作成)
delmod var
共有メモリを削除する
HSP標準命令で共有メモリ用のモジュール変数を開放します。
var 開放するモジュール型変数
Mmry_DupMemory var, array, int
変数に共有メモリを割り当てる
共有メモリを参照・代入するための変数を指定します。
var 対象のモジュール変数
array割り当てる変数
int
0 or 4 (int型)
2 (str型)
変数の型指定、vartype,dupptr参照
(stat)n [byte] (確保したメモリサイズ)
パラメータは上から。var:変数、array:配列変数、int:数値、str:文字列、(stat):実行後のシステム変数。

モジュール

/*====================================================================
                      共有メモリを使うモジュール
HSP3.0          2005.11.19
                2006. 1. 7  新規作成
HSP3.22         2011. 4. 7  再処理
HSP3.3β2             5.21  モジュール再構成、名称変更
----------------------------------------------------------------------
共有メモリ作成(HSP標準命令)
    newmod  モジュール変数, モジュール名, 共有名, Size
        モジュール変数  以降の操作対象になるモジュール型変数
        モジュール名    MemoryMapModule
        共有名          メモリの名前(同じ名前を指定することで共有できる)
        Size            メモリの確保サイズ(Byte単位)
        stat            0(失敗) or 1(新規作成した) or 2(2個目以降の作成)

共有メモリ削除(HSP標準命令)
    delmod  モジュール変数
        モジュール変数  削除対象のモジュール型変数

変数に共有メモリを割り当てる
    Mmry_DupMemory  モジュール変数, 変数名, 変数の型指定
        モジュール変数  対象のモジュール型変数
        変数名          共有メモリを割り当てる変数
                        この変数が代入・参照の対象になる
                        (dupしているだけなので自動拡張などは厳禁)
        変数の型指定    省略・0の場合は、int型
        stat            メモリの確保サイズ(Byte)が代入される

====================================================================*/
#ifndef MemoryMapModuleIncluded
#define MemoryMapModuleIncluded
#module MemoryMapModule MapHandle, StartPos, iSize
#uselib "KERNEL32.dll"
#func CreateFileMapping "CreateFileMappingA" int, nullptr, int, nullptr, int, str   ;stat=handle
;ファイルマッピングオブジェクト作成 -1:仮想空間, 0:属性, 4:読み書き, 0:size上, SIZE, NAME
#func CloseHandle "CloseHandle" int             ;オブジェクトハンドルをクローズする
#func MapViewOfFile "MapViewOfFile" int, int, nullptr, nullptr, nullptr     ;stat=開始位置
;仮想空間へのマッピング HANDLE, 2:読み書き, 0:Offset上, 0:Offset下, 0:全体指定
#func UnmapViewOfFile "UnmapViewOfFile" int     ;マッピング解除     開始位置
#func GetLastError "GetLastError"   ;エラーコード取得

#modinit str n, int s   ;名前と大きさ
    MapHandle  = 0  : StartPos = 0  : iSize = s ;モジュールの変数たち

    CreateFileMapping -1, 4, s, n       ;マッピングオブジェクト作成
    MapHandle = stat
    if MapHandle {
        GetLastError  : ib = stat       ;作成時の情報を取っておく
        MapViewOfFile MapHandle, 2      ;マッピング
        StartPos = stat
    }

    if MapHandle == 0 | StartPos == 0   : return 0  ;失敗
    if ib != 183                        : return 1  ;初作成
    return 2                                        ;作成完了(2個目以降)

#modterm
    if StartPos   : UnmapViewOfFile StartPos
    if MapHandle  : CloseHandle     MapHandle
    return

#modfunc Mmry_DupMemory array a, int t
    if StartPos == 0  : return 0    ;モジュール作成で失敗している
    if t == 0  : ib = 4  : else  : ib = t
    dupptr a, StartPos, iSize, ib
    return iSize

; http://www.tvg.ne.jp/menyukko/
; Copyright(C) 2005-2012 衣日和 All rights reserved.
#global #endif