RELoadProc

リッチエディットコントロールのファイル読み込み用の EditStreamCallback コールバック関数のサンプルコードです。

関数コード

関数のマシン語コードは以下のとおりです。スクリプトで以下のコードをそのまま記述し、この変数のアドレスを関数アドレスとして使用します。(実行には xdim.as が必要)

xdim fnRELoadProc, 9
fnRELoadProc.0 = $1024448b, $0c244c8b, $0824548b, $8b50006a, $510c2444
fnRELoadProc.5 = $51088b52, $f70450ff, $40c01bd8, $000010c2

使用方法

リッチエディットコントロールに EM_STREAMIN メッセージを送信する際に、 EDITSTREAM 構造体のメンバを以下のように設定しておく必要があります。

dwCookie メンバには、 GENERIC_READ アクセスを持つファイルハンドルと、 ReadFile 関数のアドレスを順に格納した変数のアドレスを指定しておく必要があります。これらはコールバック関数の中で使用されるもので、以下のように定義付けられた内部構造体になっています。

typedef struct {
    HANDLE hFile;          // ファイルハンドル
    FARPROC pfnReadFile;   // ReadFile 関数のアドレス
} RELOADDATA;

hFile メンバには GENERIC_READ アクセスを持つファイルハンドルを格納してください。また、 pfnCallback メンバには、 ReadFile 関数のアドレスを格納してください。

《サンプルモジュール》 リッチエディット読み込みモジュール

モジュール定義命令
RichEditLoadFile n1, s2, n3
n1 :リッチエディットハンドル
s2 :ファイル名
n3EM_STREAMINwParam の値
機能

リッチエディットに EM_STREAMIN を送信し、内容をファイルから読み出します。ファイルハンドルは GENERIC_READ アクセスを持っていなければなりません。

実行後の stat

0 :正常に保存されました。

1 :ファイルのオープンに失敗しました。

2 :ファイルの読み取りに失敗しました。

    #include "xdim.as"

    #module

    #deffunc RichEditLoadFile int, str, int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル
    mref setfilename, 33    ; ファイル名
    mref fmt, 2             ; EM_STREAMOUTの wParam 値
    mref stt, 64            ; stat

    sdim filename, 260
    filename = setfilename      ; いったん別の変数に移す

    ; コールバック関数のコード
    xdim fnRELoadProc, 9
    fnRELoadProc.0 = $1024448b, $0c244c8b, $0824548b, $8b50006a, $510c2444
    fnRELoadProc.5 = $51088b52, $f70450ff, $40c01bd8, $000010c2

    ; ファイルをオープンする
    pm = 0, $80000000, 0, 0, 3, 0, 0
    getptr pm.0, filename
    dllproc "CreateFileA", pm, 7, D_KERNEL@
    hFile = stat
    if hFile == -1 : stt = 1 : return

    ; 内部構造体(ファイルハンドルおよび ReadFile 関数のアドレス)
    loaddata = hFile
    dll_getfunc loaddata.1, "ReadFile", D_KERNEL@

    ; EDITSTREAM 構造体
    getptr edstream.0, loaddata         ; 内部構造体のアドレス
    edstream.1 = 0
    getptr edstream.2, fnRELoadProc     ; コールバック関数のアドレス

    ; EM_STREAMIN メッセージ送信
    pm = hEdit, 0x0449, fmt
    getptr pm.3, edstream
    sendmsg pm

    ; ハンドルをクローズ
    dllproc "CloseHandle", hFile, 1, D_KERNEL@

    if edstream.1 : stt = 2 : else : stt = 0
    return

    #global

このコールバック関数のソースコード

#include 

typedef struct {
    HANDLE hFile;
    FARPROC pfnReadFile;
} RELOADDATA;

DWORD CALLBACK RELoadProc(
    DWORD   dwCookie,
    LPBYTE  pbBuffer,
    LONG    cb,
    LONG    *pcb)
{
    RELOADDATA *pData = (RELOADDATA *)dwCookie;
    // コールバック関数の引数をそのままReadFile関数に渡します。
    if (pData->pfnReadFile(pData->hFile, pbBuffer, cb, pcb, NULL) != FALSE)
        return 0;
    else
        return 1;
}