RegSetValueEx и CHAR - PullRequest
       0

RegSetValueEx и CHAR

0 голосов
/ 30 января 2012

рассмотрите следующий код

addHash("hash");

bool addHash(char* hash) {
    HKEY hKey = 0;
    int code = RegOpenKey(HKEY_CURRENT_USER, subkey, &hKey);

    const int length = strlen(hash)+1;
    WCHAR whash[100];
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, hash, strlen(hash), whash, 100);
    LONG setRes = RegSetValueEx(hKey, L"hash", 0, REG_SZ, (LPBYTE)whash, strlen(hash)+1);

    return true;
}

После того, как код скомпилирован и выполнен, "ha" помещается в реестр.Может кто-нибудь сказать мне, где проблема?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2012

Я думаю, это то, что вы пытаетесь сделать:

#include <tchar.h>
#include <Windows.h>
using namespace std;

bool addHash(wstring hash) {
    const wchar_t* wHash = hash.c_str();
    LONG ret = RegSetKeyValue(HKEY_CURRENT_USER, _T("Software\\aa\\test"), _T("hash"), REG_SZ, wHash, hash.length() * sizeof(wchar_t));
    return (ret == ERROR_SUCCESS);
}

int main()
{
    addHash(_T("A42B2094EDC43"));
    return 0;
}

Надеюсь, это поможет;)

1 голос
/ 30 января 2012

Последний аргумент - это количество байтов, а не количество символов, на которое указывает второй последний аргумент.

Таким образом, первые пять байтов (strlen(hash) + 1) из whash будут сохранены вреестр.Измените на:

LONG setRes = RegSetValueEx(hKey,
                            L"hash",
                            0,
                            REG_SZ,
                            (LPBYTE)whash,
                            (wcslen(whash) + 1) * sizeof(WCHAR));

Вам также может понадобиться инициализировать whash (я не думаю, что MultiByteToWideChar() добавляет для вас нулевой терминатор):

WCHAR whash[100] = { 0 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...