| 116 | // If so, strange errors occur. |
| 117 | impl MagInterface { |
| 118 | fn new() -> Result<Self> { |
| 119 | let mut s = MagInterface { |
| 120 | init_succeeded: false, |
| 121 | lib_handle: NULL as _, |
| 122 | mag_initialize_func: None, |
| 123 | mag_uninitialize_func: None, |
| 124 | set_window_source_func: None, |
| 125 | set_window_filter_list_func: None, |
| 126 | set_image_scaling_callback_func: None, |
| 127 | }; |
| 128 | s.init_succeeded = false; |
| 129 | unsafe { |
| 130 | // load lib |
| 131 | let lib_file_name = "Magnification.dll"; |
| 132 | let lib_file_name_c = CString::new(lib_file_name)?; |
| 133 | s.lib_handle = LoadLibraryExA( |
| 134 | lib_file_name_c.as_ptr() as _, |
| 135 | NULL, |
| 136 | LOAD_WITH_ALTERED_SEARCH_PATH, |
| 137 | ); |
| 138 | if s.lib_handle.is_null() { |
| 139 | return Err(Error::new( |
| 140 | ErrorKind::Other, |
| 141 | format!( |
| 142 | "Failed to LoadLibraryExA {}, error {}", |
| 143 | lib_file_name, |
| 144 | Error::last_os_error() |
| 145 | ), |
| 146 | )); |
| 147 | }; |
| 148 | |
| 149 | // load functions |
| 150 | s.mag_initialize_func = Some(std::mem::transmute(Self::load_func( |
| 151 | s.lib_handle, |
| 152 | "MagInitialize", |
| 153 | )?)); |
| 154 | s.mag_uninitialize_func = Some(std::mem::transmute(Self::load_func( |
| 155 | s.lib_handle, |
| 156 | "MagUninitialize", |
| 157 | )?)); |
| 158 | s.set_window_source_func = Some(std::mem::transmute(Self::load_func( |
| 159 | s.lib_handle, |
| 160 | "MagSetWindowSource", |
| 161 | )?)); |
| 162 | s.set_window_filter_list_func = Some(std::mem::transmute(Self::load_func( |
| 163 | s.lib_handle, |
| 164 | "MagSetWindowFilterList", |
| 165 | )?)); |
| 166 | s.set_image_scaling_callback_func = Some(std::mem::transmute(Self::load_func( |
| 167 | s.lib_handle, |
| 168 | "MagSetImageScalingCallback", |
| 169 | )?)); |
| 170 | |
| 171 | // MagInitialize |
| 172 | if let Some(init_func) = s.mag_initialize_func { |
| 173 | if FALSE == init_func() { |
| 174 | return Err(Error::new( |
| 175 | ErrorKind::Other, |