qvopenapi_sys/
lib.rs

1/**
2 * https://github.com/rust-lang/rust/issues/79609
3 * To bypass missing 'dwarf' exception handling on mingw i686 installations,
4 * set panic = abort and provide mock unwind symbol to the linker
5 */
6#[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}