Если все значения являются константами, вам может потребоваться использовать строковый литерал вместо ненужного составления строк.
Если вы строите строку 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 ++.