Encapsulate LoadLibrary with macro definition to facilitate dynamic loading of dll and loadlibrarydll

Source: Internet
Author: User

Encapsulate LoadLibrary with macro definition to facilitate dynamic loading of dll and loadlibrarydll

When I load dll dynamically, do you feel a lot of trouble? Every time: LoadLibrary,: GetProcAddress, and a bunch of typedef functions. I am bored recently. I encapsulated it with a macro, so I can write less code, which is quite convenient to use.

However, you can add up to five parameters. I think it will be nice to wait for the next time I use flexbison to write a generation tool.

1 # pragma once 2 /*! \ Brief Dynamic Load dll, and call the export function 3 author: 12178761@qq.com 4 */5 # define DLLLOADER_BEGIN (NAME) \ 6 class DLLLOADER _ # NAME \ 7 {\ 8 public: \ 9 static BOOL Init (LPCWSTR sDllPath) {\ 10 if (RefHModule () \ 11 {\ 12 return TRUE; \ 13} \ 14 RefHModule () = :: loadLibrary (sDllPath); \ 15 if (! RefHModule () \ 16 {\ 17 return FALSE; \ 18} \ 19 return TRUE; \ 20} \ 21 static void UnInit () {\ 22 if (RefHModule ()) \ 23 {\ 24 FreeLibrary (RefHModule (); \ 25 RefHModule () = NULL; \ 26} \ 27} \ 28 static HMODULE & RefHModule () {\ 29 static hmodule m = NULL; \ 30 return M; \ 31} 32 # define DLLLOADER_ENTRY_0 (FUNNAME, FUNDESC, FUNRET, FUNRETDEF) \ 33 typedef FUNRET (FUNDESC * _ # FUNNAME) (); \ 34 static _ # FUNNAME Ref # FUNNAME () {\ 35 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 36 return F; \ 37} \ 38 static funret funname () {\ 39 if (Ref # FUNNAME () \ 40 {\ 41 return Ref # FUNNAME ()(); \ 42} \ 43 return FUNRETDEF; \ 44} 45 # define DLLLOADER_ENTRY_VOID0 (FUNNAME, FUNDESC) \ 46 typedef void (FUNDESC * _ # FUNNAME )(); \ 47 static _ # FUNNAME Ref # FUNNAME () {\ 48 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME ); \ 49 return F; \ 50} \ 51 static void FUNNAME () {\ 52 if (Ref # FUNNAME () \ 53 {\ 54 Ref # FUNNAME () (); \ 55} \ 56} 57 # define DLLLOADER_ENTRY_1 (FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1) \ 58 typedef FUNRET (FUNDESC * _ # FUNNAME) (PARAMTYPE1 ); \ 59 static _ # FUNNAME Ref # FUNNAME () {\ 60 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME ); \ 61 return F; \ 62} \ 63 static funret funname (PARAMTYPE1 PARAM1) {\ 64 if (Ref # FUNNAME ()) \ 65 {\ 66 return Ref # FUNNAME () (PARAM1); \ 67} \ 68 return FUNRETDEF; \ 69} 70 # define DLLLOADER_ENTRY_VOID1 (FUNNAME, FUNDESC, PARAMTYPE1) \ 71 typedef void (FUNDESC * _ # FUNNAME) (PARAMTYPE1); \ 72 static _ # FUNNAME Ref # FUNNAME () {\ 73 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 74 return F; \ 75} \ 76 static void FUNNAME (PARAMTYPE1 PARAM1) {\ 77 if (Ref # FUNNAME () \ 78 {\ 79 Ref # FUNNAME () (PARAM1 ); \ 80} \ 81} 82 # define DLLLOADER_ENTRY_2 (FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1, PARAMTYPE2) \ 83 typedef FUNRET (FUNDESC * _ # FUNNAME) (PARAMTYPE1, PARAMTYPE2); \ 84 static _ ## FUNNAME Ref ## FUNNAME () {\ 85 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 86 return F; \ 87} \ 88 static funret funname (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2) {\ 89 if (Ref # FUNNAME ()) \ 90 {\ 91 return Ref # FUNNAME () (PARAM1, PARAM2); \ 92} \ 93 return FUNRETDEF; \ 94} 95 # define DLLLOADER_ENTRY_VOID2 (FUNNAME, FUNDESC, PARAMTYPE1, PARAMTYPE2) \ 96 typedef void (FUNDESC * _ # FUNNAME) (PARAMTYPE1, PARAMTYPE2); \ 97 static _ # FUNNAME Ref # FUNNAME () {\ 98 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 99 return F; \ 100} \ 101 static void FUNNAME (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2) {\ 102 if (Ref # FUNNAME () \ 103 {\ 104 Ref # FUNNAME () (PARAM1, PARAM2); \ 105} \ 106} 107 # define DLLLOADER_ENTRY_3 (FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1, PARAMTYPE2, PARAMTYPE3) \ 108 typedef FUNRET (FUNDESC * _ # FUNNAME) (PARAMTYPE1, PARAMTYPE2, PARAMTYPE3); \ 109 static _ # FUNNAME Ref # FUNNAME () {\ 110 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 111 return F; \ 112} \ 113 static funret funname (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3) {\ 114 if (Ref ## FUNNAME ()) \ 115 {\ 116 return Ref # FUNNAME () (PARAM1, PARAM2, PARAM3); \ 117} \ 118 return FUNRETDEF; \ 119} 120 # define DLLLOADER_ENTRY_VOID3 (FUNNAME, FUNDESC, PARAMTYPE1, PARAMTYPE2, PARAMTYPE3) \ 121 typedef void (FUNDESC * _ # FUNNAME) (PARAMTYPE1, PARAMTYPE2, PARAMTYPE3); \ 122 static _ # FUNNAME Ref # FUNNAME () {\ 123 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 124 return F; \ 125} \ 126 static void FUNNAME (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3) {\ 127 if (Ref ## FUNNAME ()) \ 128 {\ 129 Ref # FUNNAME () (PARAM1, PARAM2, PARAM3); \ 130} \ 131} 132 # define DLLLOADER_ENTRY_4 (FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1, \ 133 PARAMTYPE2, PARAMTYPE3, PARAMTYPE4) \ 134 typedef FUNRET (FUNDESC * _ # FUNNAME) (PARAMTYPE1, PARAMTYPE2, PARAMTYPE3, PARAMTYPE4 ); \ 135 static _ # FUNNAME Ref # FUNNAME () {\ 136 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME ); \ 137 return F; \ 138} \ 139 static funret funname (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4) {\ 140 if (Ref ## FUNNAME ()) \ 141 {\ 142 return Ref # FUNNAME () (PARAM1, PARAM2, PARAM3, PARAM4); \ 143} \ 144 return FUNRETDEF; \ 145} 146 # define DLLLOADER_ENTRY_VOID4 (FUNNAME, FUNDESC, PARAMTYPE1, \ 147 PARAMTYPE2, PARAMTYPE3, PARAMTYPE4) \ 148 typedef void (FUNDESC * _ # FUNNAME) (PARAMTYPE1, PARAMTYPE2, PARAMTYPE3, PARAMTYPE4 ); \ 149 static _ # FUNNAME Ref # FUNNAME () {\ 150 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME ); \ 151 return F; \ 152} \ 153 static void FUNNAME (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4) {\ 154 if (Ref ## FUNNAME ()) \ 155 {\ 156 Ref # FUNNAME () (PARAM1, PARAM2, PARAM3, PARAM4); \ 157} \ 158} 159 # define DLLLOADER_ENTRY_5 (FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1, \ 160 PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5) \ 161 typedef FUNRET (FUNDESC * _ # FUNNAME) (PARAMTYPE1, \ 162 PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5 ); \ 163 static _ # FUNNAME Ref # FUNNAME () {\ 164 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME ); \ 165 return F; \ 166} \ 167 static funret funname (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, \ 168 PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4, PARAMTYPE5 PARAM5) {\ 169 if (Ref # FUNNAME () \ 170 {\ 171 return Ref # FUNNAME () (PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 ); \ 172} \ 173 return FUNRETDEF; \ 174} 175 # define DLLLOADER_ENTRY_VOID5 (FUNNAME, FUNDESC, PARAMTYPE1, \ 176 PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5) \ 177 typedef void (FUNDESC * _ # FUNNAME) (PARAMTYPE1, \ 178 PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5); \ 179 static _ ## FUNNAME Ref # FUNNAME () {\ 180 _ # funname f = (_ # FUNNAME): GetProcAddress (RefHModule (), # FUNNAME); \ 181 return F; \ 182} \ 183 static void FUNNAME (PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, \ 184 PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4, PARAMTYPE5 PARAM5) {\ 185 if (Ref # FUNNAME ()) \ 186 {\ 187 Ref # FUNNAME () (PARAM1, PARAM2, PARAM3, PARAM4, PARAM5); \ 188} \ 189} 190 # define DLLLOADER_END () \ 191 }; 192 193/* 194 example: 195 DLLLOADER_BEGIN (SAMPLE) 196 functions (Function1, BOOL, FALSE,) 197 functions (Function2,) 198 DLLLOADER_ENTRY_1 (Function3, BOOL, FALSE, and LPCWSTR) 199 DLLLOADER_END () 200 201 kernel (KERNEL32) 202 kernel (LoadLibraryW, WINAPI, HMODULE, 0, LPCWSTR) 203 kernel (GetModuleFileNameW, WINAPI, DWORD, 0, HMODULE, lpwenamew, DWORD) 204 DLLLOADER_END () 205 206 int _ tmain (int argc, _ TCHAR * argv []) 207 {208 DLLLOADER_SAMPLE: Init (L "C: \ Users \ sosopop \ Documents \ Visual Studio 2005 \ Projects \ testHandle \ debug \ testLoadDll. dll "); 209 DLLLOADER_SAMPLE: Function1 (); 210 DLLLOADER_SAMPLE: Function2 (); 211 DLLLOADER_SAMPLE: Function3 (L" Function3 Hello "); 212 DLLLOADER_SAMPLE :: function4 (L "Function4", L "Hello"); 213 DLLLOADER_SAMPLE: UnInit (); 214 215 DLLLOADER_KERNEL32: Init (L "c: \ windows \ system32 \ kernel32.dll "); 216 HMODULE h = DLLLOADER_KERNEL32: LoadLibraryW (L" user32.dll "); 217 WCHAR sFileName [MAX_PATH] = {0 }; 218 DWORD nSize = DLLLOADER_KERNEL32: GetModuleFileNameW (NULL, sFileName, _ countof (sFileName); 219 220 return 0; 221} 222 */

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.