リッチエディットコントロールのファイル読み込み用の 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 関数のアドレスを格納してください。
モジュール定義命令 |
|
---|---|
機能 | リッチエディットに 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
#includetypedef 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; }