@@ -130,11 +130,12 @@ fn get_reg_sys_env_handle() !voidptr {
130130fn get_reg_value (reg_env_key voidptr , key string ) ! string {
131131 // query the value (shortcut the sizing step)
132132 reg_value_size := u32 (4095 ) // this is the max length (not for the registry, but for the system %PATH%)
133- mut reg_value := unsafe { & u16 (malloc (int (reg_value_size))) }
134- if C.RegQueryValueExW (reg_env_key, key.to_wide (), 0 , 0 , reg_value, & reg_value_size) != 0 {
133+ reg_value_cap := int (reg_value_size / u32 (sizeof (u16 ))) + 1
134+ mut reg_value := []u16 {len: reg_value_cap}
135+ if C.RegQueryValueExW (reg_env_key, key.to_wide (), 0 , 0 , & u8 (reg_value.data), & reg_value_size) != 0 {
135136 return error ('Unable to get registry value for "${key} ".' )
136137 }
137- return unsafe { string_from_wide (reg_value) }
138+ return unsafe { string_from_wide (reg_value.data ) }
138139}
139140
140141// sets the value for the given $key to the given $value
@@ -148,7 +149,8 @@ fn set_reg_value(reg_key voidptr, key string, value string) !bool {
148149// Broadcasts a message to all listening windows (explorer.exe in particular)
149150// letting them know that the system environment has changed and should be reloaded
150151fn send_setting_change_msg (message_data string ) ! bool {
151- if C.SendMessageTimeoutW (os.hwnd_broadcast, os.wm_settingchange, 0 , unsafe { & u32 (message_data.to_wide ()) },
152+ message_data_wide := message_data.to_wide ()
153+ if C.SendMessageTimeoutW (os.hwnd_broadcast, os.wm_settingchange, 0 , unsafe { & u32 (message_data_wide) },
152154 os.smto_abortifhung, 5000 , 0 ) == 0 {
153155 return error ('Could not broadcast WM_SETTINGCHANGE' )
154156 }
0 commit comments