CRegistry(レジストリ操作クラス)




Auxiliary/yaneShell.h
のなかに、レジストリ操作クラスを追加しました。このクラスは独立しているので、このままぶっこぬいて、使うことが出来ます。

レジストリを汚すのは、あまり好ましくないと思うんですが、ソフトウェアのシリアルなど、ちょっとしたデータの保存に便利ではあるので作っておきました。

レジストリ操作自体は難しくないので、必要に応じて作ってもいいのですが、バグったらレジストリ破壊⇒OSを再インストールしなければならないことがあるので、十分テストされた安心できるものを使うほうが良いでしょう。

もちろん、yaneSDK3rdのものは、十分テストしてあります(^^)

枠-1
    レジストリ操作用クラス

    使用例:
        CRegistry reg("Software\\yaneu");
            // HKEY_CURRENT_USER\\Software\\yaneu フォルダ上になる
            //  ↑↑このHKEY_CURRENT_USERはコンストラクタの第二引数で設定できる
        reg.CreateFolder("yaneu");
            //  ↑そのなかにさらにyaneuというフォルダを作成
        reg.SetValue("yaneu","passwd","test");
            //  ↑そのフォルダのなかにpasswdというキーでtestという文字列をストア
        reg.SetValue("yaneu","pass",1234);
            //  ↑値をストア

        ret.GetValue("yaneu","pass",dw);
            // ↑値の取得。取得できなかったときは、返し値が非0なので、
            //  必ずそれをチェックすること!

        文字データは、GetValueで数字としては取得できない
        また、数字データは、GetValueで文字としては取得できない
        (ともにエラーリターンする)

        ret.DeleteFolder("yaneu");
            //  yaneuフォルダを削除。
            //  上の例ではHKEY_CURRENT_USER\\Software\\yaneu\\yaneu が削除される
            //  HKEY_CURRENT_USER\\Software\\yaneuは残る

        reg.DeleteFolder("");
            //  ルートフォルダを削除。
            //  上の例ではHKEY_CURRENT_USER\\Software\\yaneu が削除される


list-1 サンプル
class CApp : public CThread {
public:
    void ThreadProc(){
        // レジストリ設定〜取得
        CRegistry reg("Software\\yaneu");

        string str;
        str = "てすてす";
        reg.SetValue("folder1","moji",str);
        str.erase(); // ←消してから↓をして正しく代入されているかをテスト
        if (reg.GetValue("folder1","moji",str)==0){
            CDbg().Out(str);
        }

        DWORD dw1 = 89383; // ←やくざ屋さん?
        reg.SetValue("folder1","dword",dw1);
        dw1 = 0;
        if (reg.GetValue("folder1","dword",dw1)==0){
            CDbg().Out(dw1);
        }

        //  ユーザー定義データの書き出し
        DWORD dw[3];
        dw[0] = 123;
        dw[1] = 234;
        dw[2] = 345;
        int nSize =3*sizeof(DWORD);
        reg.SetValue("folder1","dataex",(BYTE*)&dw,nSize);
        dw[0] = 0;
        dw[1] = 0;
        dw[2] = 0;
//      nSize = 4;  //  ←実際のデータサイズと異なるとこの要求↓はエラーになる
        if (reg.GetValue("folder1","dataex",(BYTE*)&dw,nSize)==0){
            int n1 = dw[0];
            int n2 = dw[1];
            int n3 = dw[2];
            CDbg().Out("data = %d,%d,%d  size = %d",n1,n2,n3,nSize);
        }
    }
};

//  言わずと知れたWinMain
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    {
        /*
        {   //  エラーログをファイルに出力するのら!
            CTextOutputStreamFile* p = new CTextOutputStreamFile;
            p->SetFileName("Error.txt");
            Err.SelectDevice(smart_ptr<ITextOutputStream>(p));
        }
        */

        CAppInitializer init(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
        //  ↑必ず書いてね

        CSingleApp sapp;
        if (sapp.IsValid()) {
            CThreadManager::CreateThread(new CApp);
        }
        //  ここでCAppInitializerがスコープアウトするのだが、このときに
        //  すべてのスレッドの終了を待つことになる
    }
    return 0;
}