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
|