掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TSaveDialogの初期ディレクトリを取得するには? (ID:39931)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
その後。 質問した以上答えを書かねばならまいと思ったので、書いておきます。 OpenSaveMRUではなく HKCUのSoftware\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU を読むらしい。 MRUList に履歴の順序が入ってる模様。 'edbdafg' のように。 順序はともかく、それをキーにして REG_BINARYを読むとアプリケーションのファイル名と最後に確定したディレクトリ名が#0区切りで入っている。 以下ソース。 unicode なのでPWideCharがそのバイト数で飛ぶのでけっこう面倒だった。 その辺がまだ怪しいかもしれない。 function GetLastVisitedMRU: string; var reg: TRegistry; list: string; i,len: integer; buffer: pByteArray; buflen: integer; dir,fn:WideString; p,s,e: PWideChar; appname:string; appdir :string; tmplen: integer; begin Result:=''; reg:= TRegistry.Create; try reg.RootKey:= HKEY_CURRENT_USER; if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU',False) then begin if reg.ValueExists('MRUList') then begin list:=reg.ReadString('MRUList'); len:= Length(list); if len>0 then begin for i:= 1 to len do begin if reg.ValueExists(list[i]) then begin { case reg.GetDataType(list[i]) of rdUnknown : DEBUGSTROBJ(Self,'RegType:Unknown'); rdString : DEBUGSTROBJ(Self,'RegType:String'); rdExpandString: DEBUGSTROBJ(Self,'RegType:ExpandString'); rdInteger : DEBUGSTROBJ(Self,'RegType:Integer'); rdBinary : DEBUGSTROBJ(Self,'RegType:Binary'); end; } buflen:= reg.GetDataSize(list[i]); if buflen>0 then begin GetMem(buffer,buflen); try reg.ReadBinaryData(list[i],pByte(buffer)^,buflen); s:= PWideChar(buffer); p:= s; e:= s + buflen; tmplen:=0; while p<=e do begin if p^ = #0 then begin tmplen:= (p-s); Break; end; inc(p); end; if tmplen>0 then begin SetLength(fn,tmplen); copymemory(@fn[1],s,tmplen*SizeOf(WideChar)); end; s:= p; inc(s); p:= s; tmplen:=0; while p<=e do begin if p^ = #0 then begin tmplen:= (p-s); Break; end; inc(p); end; if tmplen>0 then begin SetLength(dir,tmplen); copymemory(@dir[1],s,tmplen*SizeOf(WideChar)); end; appname:=WideCharToString(@fn[1]); if appname=ExtractFilename(Application.Exename) then begin appdir :=WideCharToString(@dir[1]); Result:= appdir; OutPutDebugString(Pchar(list[i]+':'+appname+','+appdir)); Exit; end; finally FreeMem(buffer,buflen); end; end; end; end; end; end; reg.CloseKey; //finally不要 end; finally reg.Free; end; end; できたてほやほやなのでご注意。 delphiに栄光あれ。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.