| /** |
| * @file dll.c Dynamic library loading for Windows |
| * |
| * Copyright (C) 2010 Creytiv.com |
| */ |
| #include <windows.h> |
| #include <re_types.h> |
| #include "../mod_internal.h" |
| |
| |
| #define DEBUG_MODULE "dll" |
| #define DEBUG_LEVEL 5 |
| #include <re_dbg.h> |
| |
| |
| /** |
| * Open a DLL file |
| * |
| * @param name Name of DLL to open |
| * |
| * @return Handle (NULL if failed) |
| */ |
| void *_mod_open(const char *name) |
| { |
| HINSTANCE DllHandle = 0; |
| |
| DEBUG_INFO("loading %s\n", name); |
| |
| DllHandle = LoadLibraryA(name); |
| if (!DllHandle) { |
| DEBUG_WARNING("open: %s LoadLibraryA() failed\n", name); |
| return NULL; |
| } |
| |
| return DllHandle; |
| } |
| |
| |
| /** |
| * Resolve a symbol address in a DLL |
| * |
| * @param h DLL Handle |
| * @param symbol Symbol to resolve |
| * |
| * @return Address of symbol |
| */ |
| void *_mod_sym(void *h, const char *symbol) |
| { |
| HINSTANCE DllHandle = (HINSTANCE)h; |
| union { |
| FARPROC sym; |
| void *ptr; |
| } u; |
| |
| if (!DllHandle) |
| return NULL; |
| |
| DEBUG_INFO("get symbol: %s\n", symbol); |
| |
| u.sym = GetProcAddress(DllHandle, symbol); |
| if (!u.sym) { |
| DEBUG_WARNING("GetProcAddress: no symbol %s\n", symbol); |
| return NULL; |
| } |
| |
| return u.ptr; |
| } |
| |
| |
| /** |
| * Close a DLL |
| * |
| * @param h DLL Handle |
| */ |
| void _mod_close(void *h) |
| { |
| HINSTANCE DllHandle = (HINSTANCE)h; |
| |
| DEBUG_INFO("unloading %p\n", h); |
| |
| if (!DllHandle) |
| return; |
| |
| FreeLibrary(DllHandle); |
| } |