3
3
use std:: { io, sync:: Mutex } ;
4
4
5
5
#[ cfg( windows) ]
6
- use winreg:: {
7
- enums:: { HKEY_CURRENT_USER , KEY_READ , KEY_WRITE } ,
8
- RegKey , RegValue ,
9
- } ;
6
+ // use winreg::{
7
+ // enums::{HKEY_CURRENT_USER, KEY_READ, KEY_WRITE},
8
+ // RegKey, RegValue,
9
+ // };
10
+ use windows_registry:: { Key , CURRENT_USER } ;
11
+ #[ cfg( windows) ]
12
+ use windows_result:: HRESULT ;
13
+ #[ cfg( windows) ]
14
+ use windows_sys:: Win32 :: Foundation :: ERROR_FILE_NOT_FOUND ;
10
15
11
16
/// Support testing of code that mutates global state
12
17
pub fn with_saved_global_state < S > (
@@ -28,7 +33,7 @@ pub fn with_saved_global_state<S>(
28
33
29
34
#[ cfg( windows) ]
30
35
pub fn with_saved_path ( f : & mut dyn FnMut ( ) ) {
31
- with_saved_reg_value ( & RegKey :: predef ( HKEY_CURRENT_USER ) , "Environment" , "PATH" , f)
36
+ with_saved_reg_string ( CURRENT_USER , "Environment" , "PATH" , f)
32
37
}
33
38
34
39
#[ cfg( unix) ]
@@ -37,37 +42,35 @@ pub fn with_saved_path(f: &mut dyn FnMut()) {
37
42
}
38
43
39
44
#[ cfg( windows) ]
40
- pub fn get_path ( ) -> io:: Result < Option < RegValue > > {
41
- get_reg_value ( & RegKey :: predef ( HKEY_CURRENT_USER ) , "Environment" , "PATH" )
45
+ pub fn get_path ( ) -> io:: Result < Option < String > > {
46
+ get_reg_string ( CURRENT_USER , "Environment" , "PATH" )
42
47
}
43
48
44
49
#[ cfg( windows) ]
45
- pub fn with_saved_reg_value ( root : & RegKey , subkey : & str , name : & str , f : & mut dyn FnMut ( ) ) {
50
+ pub fn with_saved_reg_string ( root : & Key , subkey : & str , name : & str , f : & mut dyn FnMut ( ) ) {
46
51
with_saved_global_state (
47
- || get_reg_value ( root, subkey, name) ,
48
- |p| restore_reg_value ( root, subkey, name, p) ,
52
+ || get_reg_string ( root, subkey, name) ,
53
+ |p| restore_reg_string ( root, subkey, name, p) ,
49
54
f,
50
55
)
51
56
}
52
57
53
58
#[ cfg( windows) ]
54
- fn get_reg_value ( root : & RegKey , subkey : & str , name : & str ) -> io:: Result < Option < RegValue > > {
55
- let subkey = root. open_subkey_with_flags ( subkey, KEY_READ | KEY_WRITE ) ?;
56
- match subkey. get_raw_value ( name) {
59
+ fn get_reg_string ( root : & Key , subkey : & str , name : & str ) -> io:: Result < Option < String > > {
60
+ let subkey = root. create ( subkey) ?;
61
+ match subkey. get_string ( name) {
57
62
Ok ( val) => Ok ( Some ( val) ) ,
58
- Err ( ref e) if e. kind ( ) == io :: ErrorKind :: NotFound => Ok ( None ) ,
59
- Err ( e) => Err ( e) ,
63
+ Err ( ref e) if e. code ( ) == HRESULT :: from_win32 ( ERROR_FILE_NOT_FOUND ) => Ok ( None ) ,
64
+ Err ( e) => Err ( e. into ( ) ) ,
60
65
}
61
66
}
62
67
63
68
#[ cfg( windows) ]
64
- fn restore_reg_value ( root : & RegKey , subkey : & str , name : & str , p : Option < RegValue > ) {
65
- let subkey = root
66
- . open_subkey_with_flags ( subkey, KEY_READ | KEY_WRITE )
67
- . unwrap ( ) ;
69
+ fn restore_reg_string ( root : & Key , subkey : & str , name : & str , p : Option < String > ) {
70
+ let subkey = root. create ( subkey) . unwrap ( ) ;
68
71
if let Some ( p) = p. as_ref ( ) {
69
- subkey. set_raw_value ( name, p) . unwrap ( ) ;
72
+ subkey. set_string ( name, p) . unwrap ( ) ;
70
73
} else {
71
- let _ = subkey. delete_value ( name) ;
74
+ let _ = subkey. remove_value ( name) ;
72
75
}
73
76
}
0 commit comments