レジストリのバイナリデータの設定

[戻る]
さと〜 2014/02/24(月) 20:59:25
iniファイルの指定されたセクション内にあるキーから取得した値を編集して、レジスト
リキーに設定するソースを作成しており、編集した値を設定する文字列が合わず、ソース
が止まっております。

iniファイル
[xxxx]
abc=0x3f,0x8a,0x2e,0x64,0x01

ソース
CHAR  temp[128];
CHAR  abcdata[128];
BYTE   vData[128];


//iniファイルから値取得
r = GetPrivateProfileString(sect, "abc", "", temp, sizeof(temp), path);
if (r > 0) strcpy(abcdata, temp);

//バイナリデータ化にする
※ここで「vData[] = {0x3f,0x8a,0x2e,0x64,0x01};」のような形にするにはどのような
処理がありますのでしょうか?

//レジストリキーの値設定
r = RegSetValueEx(key, name, 0, REG_BINARY, (LPBYTE)vData, 
sizeof(vData)/sizeof(vData[0]));

環境
XP, VC6.0

以上、ご教授よろしくお願い申し上げます。

瀬戸っぷ [E-Mail] 2014/02/25(火) 01:26:10
文字列"0x3f,0x8a,0x2e,0x64,0x01"から、数値変換してBYTE配列にしたい。
ってコトですよね?

strtol()系を使用されては?
# ただし戻り値はlong型なので、その辺りにはご注意を。

http://msdn.microsoft.com/ja-jp/library/w4z2wdyc.aspx
こっちはVS2013のもの…ですけどね。
手元のVC6のリファレンスマニュアルでstrtol()について調べてみてくださいな。
# まぁ、検索すればそういう処理コードの例くらい見つかるでしょう。たぶん。

さと〜 2014/02/25(火) 11:04:05
瀬戸っぷさん、ありがとうございます。

TCHAR  *endp;
LONG  value;
value = strtol(abcdata, &endp,  0);

に行い、結果が「63」になりましたが、繰返しが必要でしょうか?

初歩的ですみませんが、宜しくお願い申し上げます。

仲澤@失業者 2014/02/25(火) 13:45:24
>に行い、結果が「63」になりましたが、繰返しが必要でしょうか?

それだと、頭の0x3fの部分しか変換できていません。
やや難しいですが、strtok()関数などを使用して、区切り文字(カンマ)で
分離しながらstrtol()で数値変換してはどうでしょう。

ちなみにstrtol()の「基数」はこの場合は16進数なので16を指定します。

さと〜 2014/02/25(火) 16:13:40
仲澤さん、ありがとうございます。

While文で、strtolを処理して、繰返し終了後、memcpyで配列をコピー
しましたが、うまくいきませんでした。

サンプルソースを頂ければ、幸いです。

お手数ですが、宜しくお願い申し上げます。

蒼の洞窟 2014/02/25(火) 17:57:58
strtolの2番目の引数を使えば、strtok使わなくてもいけるかな?


以下、てけとー

#include <cstdio>
#include <windows.h>
#include <tchar.h>

int main(void)
{
    TCHAR abcdata[128] = _T("0x3f,0x8a,0x2e,0x64,0x01");
    BYTE vData[128] = {0};

    TCHAR* pStart = abcdata;
    TCHAR* pEnd = NULL;

    int i = 0;
    while (true)
    {
        long l = _tcstol(pStart, &pEnd, 16);

        vData[i] = (BYTE)l;

        if (*pEnd == _T('\0')) {
            break;
        }

        pStart = pEnd + 1;  // 手抜き CharNextとか使ったほうがよさげ
        ++i;
    }

    for (int j = 0; j <= i; ++j) {
        printf("0x%02x ", vData[j]);
    }
    printf("\n");
    
    return 0;
}

仲澤@失業者 2014/02/26(水) 11:26:23
まぁこんな感じ、

char     abcdata[ 32] = {"0x3f,0x8a,0x2e,0x64,0x01"};
char *    pEnd;
char *    context;
long    Value[ 10];
long    ValueCnt    = 0;
char *    strwork    = strtok_s( abcdata, ",", &context);//abcdataは破壊される
while( NULL != strwork){
    Value[ ValueCnt] = strtol( strwork, &pEnd, 16);
    ValueCnt++;
    strwork = strtok_s( NULL, ",", &context);//NULLを与えると次のトークンを戻す
}

さと〜 2014/03/03(月) 22:25:04
[[解決]]
蒼の洞窟さん、仲澤さん

サンプルソースを提供いただき、ありがとうございました。
助かりました。

以上、取り次ぎ、お礼とさせていただきます。

古いスレッドには追加発言できません。