Как мне записать значения REG_MULTI_SZ в реестр? - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь записать значение REG_MULTI_SZ в реестр Windows, используя C ++. Я застрял на конвертации c-строк, которые у меня есть, в формат MULTI_SZ. Есть ли удобный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Вот альтернатива C ++ 0x.

static const std::string vals [] = 
{
    "a", "bb", "ccc"
};
static const size_t num_vals = sizeof(vals)/sizeof(vals[0]);
std::string reg_out = std::accumulate(&vals[0], &vals[num_vals], std::string(), [](std::string& so_far, const std::string& cur) -> std::string
{
    so_far += cur;
    so_far += '\0';
    return so_far;
});
reg_out += '\0';
reg_out.size();

RegSetValueEx(...,...,...,REG_MULTI_SZ, rerinterpret_cast<const BYTE*>(&reg_out[0]), reg_out.size());
2 голосов
/ 14 сентября 2011

Тебе придется сделать это самому. Учитывая

char ** strings; // array of strings
int N; // number of strings

Вы считаете длину multi_sz

int len=1;
for(int i=0; i<N; i++)
  len += strlen(strings[i])+1;

и заполните его

char* multi_sz = malloc(len), ptr=multi_sz;
memset(multi_sz, 0, len);
for(int i=0; i<N; i++) {
  strcpy(ptr, strings[i]);
  ptr += strlen(strings[i])+1;
}
0 голосов
/ 19 октября 2017

Если все значения являются константами, вам может потребоваться использовать строковый литерал вместо ненужного составления строк.

Если вы строите строку C ++ из строкового литерала, то первый нулевой символ завершит ее:

string s("aaa\0bbb");  // constructs the string "aaa"

Однако строка C ++ может содержать нулевые символы и может быть составлена ​​из строкового литерала, содержащего нулевые символы, следующим образом:

const char sz[] = "aaa\0bbb";
string szs(sz, sizeof(sz) / sizeof(char));  // constructs the string "aaa\0bbb"

Тогда вы можете просто сделать:

RegSetValueEx(...,...,...,REG_MULTI_SZ, rerinterpret_cast<const BYTE*>(&szs[0]), szs.size());

Обратите внимание, что, в отличие от того, что предлагается в других ответах, нет необходимости в двух нулевых символах в конце значения (один для завершения последней строки и один для завершения списка). Это фактически добавит пустую строку в список значений, что может быть нежелательным. В этом примере вторая строка (и весь список) заканчивается нулевым символом, который автоматически добавляется в конец строки C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...