見出し画像

Notes C API探訪: メモリハンドル

通常、C/C++でメモリ領域を取得する場合、malloc/freeやnew/deleteを使いますが、あえてNotes/Dominoからメモリ資源を確保することもできます。その場合、Windows SDKのように、メモリハンドルという形で取得することができます。取得したメモリハンドルを通して、メモリにアクセスし、領域を拡張/縮小し、不要になったらリリースすることができます。

DHANDLE

DHANDLE型は、Dominoハンドル(汎用メモリハンドル)です。

#include <global.h>
typdef HANDLE DHANDLE;  // Windowsの場合、Windows.hで定義済みのHANDLEを流用

多くのNotes/Domino用ハンドルはDHANDLE型の別名として定義されています(データベースハンドル、文書ハンドルなど)。

OSMemAlloc

OSMemAlloc関数は、メモリ領域を確保してハンドルを返します。

#include <osmem.h>
STATUS LNPUBLIC	OSMemAlloc (WORD BlkType, DWORD dwSize, DHANDLE far *retHandle);

BlkTypeは、MEM_SHAREフラグとMEM_GROWABLEフラグのオン/オフを指定します。MEM_SHAREは他のプロセスと共有できるメモリとして、MEM_GROWABLEは拡張、縮小が可能なメモリとして宣言できます。
dwSizeは、確保する領域サイズを指定します。
retHandleは、確保したメモリ領域のハンドル値を返します。

OSLockObject

OSLockObject関数は、ハンドル状態のメモリをロックしてポインタを返します。確保したメモリ領域にアクセスするには、このポインタを使用します。

#include <osmem.h>
void far * LNPUBLIC OSLockObject (DHANDLE Handle);

Handleは、ロックしたいメモリハンドルを指定します。
戻り値は、ロックした領域の先頭ポインタを返します。

OSUnlockObject

OSUnlockObject関数は、ロックされたメモリ領域をアンロックします。「アンロック」とは、ポインタによる利用を停止し、ハンドルが確保しているメモリ領域を、移動したり、拡張したり、縮小したり、解放したりできる状態を指します。

#include <osmem.h>
BOOL LNPUBLIC OSUnlockObject (DHANDLE Handle);

Handleは、アンロックしたいメモリハンドルを指定します。
戻り値はBOOL型ですが常にTRUEを返します(チェック不要)。

OSMemGetSize

OSMemGetSize関数は、メモリハンドルが確保しているメモリ領域のサイズを返します。

#include <osmem.h>
STATUS LNPUBLIC	OSMemGetSize (DHANDLE Handle, DWORD far *retSize);

Handleは、サイズを知りたいメモリのハンドルです。
retSizeは、メモリ領域のサイズサイズを返す変数へのポインタです。

OSMemRealloc

OSMemRealloc関数は、メモリハンドルが確保している領域を拡張、または縮小します。OSMemAlloc関数でMEM_GROWABLEフラグを立てたメモリハンドルが対象です。

#include <osmem.h>
STATUS LNPUBLIC	OSMemRealloc (DHANDLE Handle, DWORD NewSize);

Handleは、リサイズしたいメモリのハンドルです。
NewSizeは、リサイズ後のメモリ領域のサイズを指定します。

OSMemFree

OSMemFree関数は、メモリハンドルが確保している領域を解放します。

#include <osmem.h>
STATUS LNPUBLIC	OSMemFree (DHANDLE Handle);

Handleは、解放したいメモリ領域へのハンドルを指定します。

メモリハンドルの所有権

原則として、自分で確保したメモリ領域は自分で解放します。しかし、関数の中には所有権を譲らなければいけないものもあります。その場合、自分で確保したメモリ領域であっても、自身で解放してはいけません。

この記事が気に入ったらサポートをしてみませんか?