1#[cfg(feature = "disable-unwind")]
7#[no_mangle]
8pub extern "stdcall" fn _Unwind_Resume() {}
9
10extern crate libloading;
11extern crate windows_sys;
12
13use std::fmt;
14
15use libc::{c_char, c_int};
16#[cfg(unix)]
17use libloading::os::unix::Symbol as RawSymbol;
18#[cfg(windows)]
19use libloading::os::windows::Symbol as RawSymbol;
20use libloading::{Library, Symbol};
21use windows_sys::Win32::Foundation::*;
22
23type BOOL = c_int;
24type DWORD = u32;
25
26type WmcaLoad = extern "stdcall" fn() -> BOOL;
27type WmcaFree = extern "stdcall" fn() -> BOOL;
28type WmcaSetServer = extern "stdcall" fn(*const c_char) -> BOOL;
29type WmcaSetPort = extern "stdcall" fn(c_int) -> BOOL;
30type WmcaIsConnected = extern "stdcall" fn() -> BOOL;
31type WmcaConnect = extern "stdcall" fn(
32 HWND,
33 DWORD,
34 c_char,
35 c_char,
36 *const c_char,
37 *const c_char,
38 *const c_char,
39) -> BOOL;
40type WmcaDisconnect = extern "stdcall" fn() -> BOOL;
41type WmcaTransact =
42 extern "stdcall" fn(HWND, c_int, *const c_char, *const c_char, c_int, c_int, c_int) -> BOOL;
43type WmcaQuery =
44 extern "stdcall" fn(HWND, c_int, *const c_char, *const c_char, c_int, c_int) -> BOOL;
45type WmcaRequest =
46 extern "stdcall" fn(HWND, c_int, *const c_char, *const c_char, c_int, *const c_char) -> BOOL;
47type WmcaAttach = extern "stdcall" fn(HWND, *const c_char, *const c_char, c_int, c_int) -> BOOL;
48type WmcaDetach = extern "stdcall" fn(HWND, *const c_char, *const c_char, c_int, c_int) -> BOOL;
49type WmcaDetachWindow = extern "stdcall" fn(HWND) -> BOOL;
50type WmcaDetachAll = extern "stdcall" fn() -> BOOL;
51type WmcaSetOption = extern "stdcall" fn(*const c_char, *const c_char) -> BOOL;
52type WmcaSetAccountIndexPwd = extern "stdcall" fn(*const c_char, c_int, *const c_char) -> BOOL;
53type WmcaSetOrderPwd = extern "stdcall" fn(*const c_char, *const c_char) -> BOOL;
54type WmcaSetHashPwd = extern "stdcall" fn(*const c_char, *const c_char, *const c_char) -> BOOL;
55type WmcaSetAccountNoPwd = extern "stdcall" fn(*const c_char, *const c_char, *const c_char) -> BOOL;
56type WmcaSetAccountNoByIndex = extern "stdcall" fn(*const c_char, c_int) -> BOOL;
57
58pub struct WmcaLib {
59 pub library: Library,
60 pub load: RawSymbol<WmcaLoad>,
61 pub free: RawSymbol<WmcaFree>,
62 pub set_server: RawSymbol<WmcaSetServer>,
63 pub set_port: RawSymbol<WmcaSetPort>,
64 pub is_connected: RawSymbol<WmcaIsConnected>,
65 pub connect: RawSymbol<WmcaConnect>,
66 pub disconnect: RawSymbol<WmcaDisconnect>,
67 pub transact: RawSymbol<WmcaTransact>,
68 pub query: RawSymbol<WmcaQuery>,
69 pub request: RawSymbol<WmcaRequest>,
70 pub attach: RawSymbol<WmcaAttach>,
71 pub detach: RawSymbol<WmcaDetach>,
72 pub detach_window: RawSymbol<WmcaDetachWindow>,
73 pub detach_all: RawSymbol<WmcaDetachAll>,
74 pub set_option: RawSymbol<WmcaSetOption>,
75 pub set_account_index_pwd: RawSymbol<WmcaSetAccountIndexPwd>,
76 pub set_order_pwd: RawSymbol<WmcaSetOrderPwd>,
77 pub set_hash_pwd: RawSymbol<WmcaSetHashPwd>,
78 pub set_account_no_pwd: RawSymbol<WmcaSetAccountNoPwd>,
79 pub set_account_no_by_index: RawSymbol<WmcaSetAccountNoByIndex>,
80}
81
82impl fmt::Debug for WmcaLib {
83 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
84 write!(f, "WmcaLib")
85 }
86}
87
88pub fn bind_lib() -> Result<WmcaLib, libloading::Error> {
89 unsafe {
90 let library = Library::new("wmca.dll")?;
91 let load: Symbol<WmcaLoad> = library.get(b"wmcaLoad")?;
92 let load = load.into_raw();
93 let free: Symbol<WmcaFree> = library.get(b"wmcaFree")?;
94 let free = free.into_raw();
95 let set_server: Symbol<WmcaSetServer> = library.get(b"wmcaSetServer")?;
96 let set_server = set_server.into_raw();
97 let set_port: Symbol<WmcaSetPort> = library.get(b"wmcaSetPort")?;
98 let set_port = set_port.into_raw();
99 let is_connected: Symbol<WmcaIsConnected> = library.get(b"wmcaIsConnected")?;
100 let is_connected = is_connected.into_raw();
101 let connect: Symbol<WmcaConnect> = library.get(b"wmcaConnect")?;
102 let connect = connect.into_raw();
103 let disconnect: Symbol<WmcaDisconnect> = library.get(b"wmcaDisconnect")?;
104 let disconnect = disconnect.into_raw();
105 let transact: Symbol<WmcaTransact> = library.get(b"wmcaTransact")?;
106 let transact = transact.into_raw();
107 let query: Symbol<WmcaQuery> = library.get(b"wmcaQuery")?;
108 let query = query.into_raw();
109 let request: Symbol<WmcaRequest> = library.get(b"wmcaRequest")?;
110 let request = request.into_raw();
111 let attach: Symbol<WmcaAttach> = library.get(b"wmcaAttach")?;
112 let attach = attach.into_raw();
113 let detach: Symbol<WmcaDetach> = library.get(b"wmcaDetach")?;
114 let detach = detach.into_raw();
115 let detach_window: Symbol<WmcaDetachWindow> = library.get(b"wmcaDetachWindow")?;
116 let detach_window = detach_window.into_raw();
117 let detach_all: Symbol<WmcaDetachAll> = library.get(b"wmcaDetachAll")?;
118 let detach_all = detach_all.into_raw();
119 let set_option: Symbol<WmcaSetOption> = library.get(b"wmcaSetOption")?;
120 let set_option = set_option.into_raw();
121 let set_account_index_pwd: Symbol<WmcaSetAccountIndexPwd> =
122 library.get(b"wmcaSetAccountIndexPwd")?;
123 let set_account_index_pwd = set_account_index_pwd.into_raw();
124 let set_order_pwd: Symbol<WmcaSetOrderPwd> = library.get(b"wmcaSetOrderPwd")?;
125 let set_order_pwd = set_order_pwd.into_raw();
126 let set_hash_pwd: Symbol<WmcaSetHashPwd> = library.get(b"wmcaSetHashPwd")?;
127 let set_hash_pwd = set_hash_pwd.into_raw();
128 let set_account_no_pwd: Symbol<WmcaSetAccountNoPwd> =
129 library.get(b"wmcaSetAccountNoPwd")?;
130 let set_account_no_pwd = set_account_no_pwd.into_raw();
131 let set_account_no_by_index: Symbol<WmcaSetAccountNoByIndex> =
132 library.get(b"wmcaSetAccountNoByIndex")?;
133 let set_account_no_by_index = set_account_no_by_index.into_raw();
134 Ok(WmcaLib {
135 library,
136 load,
137 free,
138 set_server,
139 set_port,
140 is_connected,
141 connect,
142 disconnect,
143 transact,
144 query,
145 request,
146 attach,
147 detach,
148 detach_window,
149 detach_all,
150 set_option,
151 set_account_index_pwd,
152 set_order_pwd,
153 set_hash_pwd,
154 set_account_no_pwd,
155 set_account_no_by_index,
156 })
157 }
158}