More ... | Note:HSPのTips集dialogでユーザー定義のフォルダを規定として開く
/****************************************************************************** * * * 以下は関連付けされていないサブルーチン郡です。 * * 任意の場所から呼び出すことが出来ます。 * * * ******************************************************************************/ ; ______________________________________________________________________________ ;/ デフォルト値に設定された作業ディレクトリをレジストリに書き込む *reg_setworkdir /*--------------------------------------------------------------------* * レジストリに書き込むバイナリデータを用意する(Unicode) * *--------------------------------------------------------------------*/ ; レジストリに書き込む作業ディレクトリパスをunicodeに変換 to_uni u_regwdir,regwdir,0 u_wdirsize=stat ; 作業ディレクトリパスのunicodeサイズ sdim u_regwdir,u_wdirsize ; unicodeバイナリデータのバッファ to_uni u_regwdir,regwdir,-1 ; unicodeに変換 reg_bsize=u_aplnsize+u_wdirsize ; レジストリに書き込むバイナリサイズ sdim reg_bdata,reg_bsize ; レジストリに書き込むデータのバッファ ; レジストリに書き込むバイナリデータの作成 memcpy reg_bdata,u_aplname,u_aplnsize,0,0 memcpy reg_bdata,u_regwdir,u_wdirsize,u_aplnsize,0 /*--------------------------------------------------------------------* * レジストリキーを開く * *--------------------------------------------------------------------*/ prm.0=$80000001 ; ルートキー getptr prm.1,subkey ; サブキー prm.2=0 ; 予約フィールド nameClass="" getptr prm.3,nameClass ; クラス名"" prm.4=0 ; オプション prm.5=$000F003F ; アクセス権 prm.6=0 ; 継承 getptr prm.7,hkey ; 作成したキーのハンドル getptr prm.8,bstat ; 取得したキーの要因 ; LastVisitedMRUキーを作成してオープンする dllproc "RegCreateKeyExA",prm,9,hdll if dllret!0 : dialog _DLG_DLLERROR_ /*--------------------------------------------------------------------* * 文字列エントリMRUListのデータを読み取る * *--------------------------------------------------------------------*/ repeat wait 1 ; 文字列エントリMRUListのデータサイズを取得する prm.0=hkey ; 親キーのハンドル nameEntry="MRUList" getptr prm.1,nameEntry ; エントリ名 prm.2=0 ; 予約フィールド prm.3=0 ; エントリタイプ(NULL) prm.4=0 ; バッファへのポインタ(NULL) getptr prm.5,cbsize ; エントリデータのサイズ dllproc "RegQueryValueExA",prm,6,hdll if dllret=0 : break /*------------------------------------------------------------* エントリが無ければ新規作成 *------------------------------------------------------------*/ prm.0=hkey ; 親キーのハンドル nameEntry="MRUList" getptr prm.1,nameEntry ; エントリ名 prm.2=0 ; 予約フィールド prm.3=1 ; エントリタイプ(REG_SZ) szMRUList="" getptr prm.4,szMRUList ; エントリデータ prm.5=1 ; データサイズ dllproc "RegSetValueExA",prm,6,hdll if dllret!0 : dialog _DLG_DLLERROR_ loop ; データのサイズだけバッファを確保 sdim szMRUList,cbsize getptr prm.4,szMRUList ; 確保したバッファへのポインタ getptr prm.5,cbsize ; 文字列エントリMRUListのデータを取得する dllproc "RegQueryValueExA",prm,6,hdll if dllret!0 : dialog _DLG_DLLERROR_ ; バイナリエントリの数を取得する strlen nEntry,szMRUList /*--------------------------------------------------------------------* * 存在するバイナリエントリの数だけ順次検索を行う * *--------------------------------------------------------------------*/ repeat nEntry+1 match=cnt ; 検索対象のインデックス /*------------------------------------------------------------* 最後まで検索し終えたかどうか *------------------------------------------------------------*/ if cnt==nEntry{ ; エントリの数が25未満かどうか if nEntry<25{ ; 書き換えるエントリ名をnameEntryに設定 poke nameEntry,0,'a'+cnt poke nameEntry,1,$00 } else{ ; 一番古いエントリをnameEntryに設定 strmid nameEntry,szMRUList,-1,1 } break } ; MRUListから1字読込み strmid nameEntry,szMRUList,cnt,1 /*------------------------------------------------------------* バイナリデータを読み込む *------------------------------------------------------------*/ prm.0=hkey ; 親キーのハンドル getptr prm.1,nameEntry ; エントリ名 prm.2=0 ; 予約フィールド prm.3=0 ; エントリタイプ(NULL) prm.4=0 ; バッファへのポインタ(NULL) getptr prm.5,cbsize ; エントリデータのサイズ ; バイナリデータのサイズを取得する dllproc "RegQueryValueExA",prm,6,hdll if dllret!0 : dialog _DLG_DLLERROR_ ; バイナリデータを読み込むバッファを確保する sdim reg_bary,cbsize getptr prm.4,reg_bary ; 確保したバッファへのポインタ ; バイナリデータを読み込む dllproc "RegQueryValueExA",prm,6,hdll if dllret!0 : dialog _DLG_DLLERROR_ /*------------------------------------------------------------* バイナリデータを比較する *------------------------------------------------------------*/ repeat u_aplnsize peek ac,u_aplname,cnt ; 実行ファイル名の1byteデータ peek rc,reg_bary,cnt ; レジストリエントリの1byteデータ ; 不一致かどうか if ac!rc{ match=-1 : break ; 比較を中断 } loop ; 一致するかどうか if match!-1 : break loop /*--------------------------------------------------------------------* * バイナリエントリを書き換える * *--------------------------------------------------------------------*/ prm.0=hkey ; 親キーのハンドル getptr prm.1,nameEntry ; エントリ名へのポインタ prm.2=0 ; 予約フィールド prm.3=3 ; エントリタイプ(REG_BINARY) getptr prm.4,reg_bdata ; エントリデータへのポインタ prm.5=reg_bsize ; データサイズ ; レジストリにバイナリエントリを作成する dllproc "RegSetValueExA",prm,6,hdll if dllret!0 : dialog _DLG_DLLERROR_ /*--------------------------------------------------------------------* * MRUListを更新する * *--------------------------------------------------------------------*/ strmid szFront,szMRUList,0,match strmid szBack,szMRUList,match+1,nEntry-match-1 szMRUList=nameEntry+szFront+szBack strlen nEntry,szMRUList prm.0=hkey ; 親キーのハンドル nameEntry="MRUList" getptr prm.1,nameEntry ; エントリ名 prm.2=0 ; 予約フィールド prm.3=1 ; エントリタイプ(REG_SZ) getptr prm.4,szMRUList ; エントリデータ prm.5=nEntry+1 ; データサイズ dllproc "RegSetValueExA",prm,6,hdll if dllret!0 : dialog _DLG_DLLERROR_ ; キーを閉じる prm.0=hkey dllproc "RegCloseKey",prm,1,hdll if dllret!0 : dialog _DLG_DLLERROR_ return |