お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"任意のレジストリキー以下を書き出す"



,

 ブラウザのメールリンクをクリックするとポスペが立ち上がるという
 ソフトを作ったんですが メーラーとしてインストールするのでは無くて
 今レジストリに登録されている、

    HKEY_CLASSES_ROOT\mailto\shell\open\command

 、を書き換えるだけですますという手抜きな処理のためなのかどうなのか
 立て続けに不具合報告をもらったので 任意のキー以下の情報を
 テキストに書き出すプログラムを作って ユーザーに使ってもらいました。

 という訳で 間に合わせで作った手抜きソースです。(^^;
 begin … end. の所にあるように EnumRegKeys に任意のキーを渡せ
 下層キーと値を output に書き出します。


program TestPP;

uses
    Registry, Classes, Windows, Messages, SysUtils;

var
    reg : TRegistry;
    output : String;

function StrDump(str: string): String;
var
    idx : Integer;
begin
    Result := '';
    idx := 1;
    while idx<Length( str ) do begin
        Result := Result+
            format( '%.02x ', [ord( str[idx] )+ord( str[idx+1] )*$100] );
        idx := idx+2;
    end;
end;

procedure GetKeyEtc;
var
    s, s1 : String;
    ss : TStringList;
    idx : Integer;
begin
    ss := TStringList.Create;
    try
        reg.GetValueNames( ss );
        for idx := 0 to ss.Count-1 do begin
            s1 := '?';
            case reg.GetDataType( ss[idx] ) of
                rdUnknown   : s := 'unk';
                rdString    : begin
                    s := 'str';
                    s1 := reg.ReadString( ss[idx] );
                end;
                rdExpandString  : begin
                    s := 'exs';
                    s1 := reg.ReadString( ss[idx] );
                end;
                rdInteger   : begin
                    s := 'int';
                    s1 := IntToStr( reg.ReadInteger( ss[idx] ) );
                end;
                rdBinary    : begin
                    s := 'bin';
                    SetLength( s1, reg.GetDataSize( ss[idx] ) );
                    reg.ReadBinaryData( ss[idx], s1[1], Length( s1 ) );
                    s1 := StrDump( s1 );
                end;
            end;
            output := output+format( '   %s:"%s"    {%s}',
                                [s, ss[idx], s1] )+#13#10;
        end;
    finally
        ss.free;
    end;
end;

procedure EnumRegKeys(Key: String);
var
    ss : TStringList;
    idx : Integer;
begin
    ss := TStringList.Create;
    try
        if reg.OpenKey( key, false ) then begin
            try
                output := output+key+#13#10;
                GetKeyEtc;
                reg.GetKeyNames( ss );
                for idx := 0 to ss.Count-1 do begin
                    EnumRegKeys( Key+'\'+ss[idx] );
                end;
            finally
                reg.CloseKey;
            end;
        end;
    finally
        ss.Free;
    end;
end;

var
    f : TextFile;
begin
    output := '';
    reg := TRegistry.Create;
    try
        output := output+#13#10+#13#10+'- HKEY_LOCAL_MACHINE -'+#13#10;
        Reg.Rootkey := HKEY_LOCAL_MACHINE;
        EnumRegKeys( '\SOFTWARE\Clients\Mail' );

        output := output+#13#10+#13#10+'- HKEY_CLASSES_ROOT -'+#13#10;
        Reg.Rootkey := HKEY_CLASSES_ROOT;
        EnumRegKeys( '\mailto' );

        output := output+#13#10+#13#10+'- HKEY_LOCAL_MACHINE -'+#13#10;
        Reg.Rootkey := HKEY_LOCAL_MACHINE;
        EnumRegKeys( '\SOFTWARE\Classes\mailto' );

        reg.Free;
    end;

    AssignFile( f, ExtractFilePath( ParamStr( 0 ) )+'testpp.txt' );
    Rewrite( f );
    Writeln( f, output );
    CloseFile( f );

    messagebox( 0, '完了', 'TestPP.exe', MB_OK );
end.


(PXC07042) - とらじ -       URL
http://member.nifty.ne.jp/trazi

Original document by 寅次            氏 ID:(PXC07042)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum