动态调用DLL的方法(宏实现)

来源:互联网 发布:flash cs3 mac版 编辑:程序博客网 时间:2024/06/08 19:03

参考libusb:


#define DLL_DECLARE_PREFIXNAME(api, ret, prefixname, name, args)    \

typedef ret (api * __dll_##name##_t)args;                       \
static __dll_##name##_t prefixname = NULL


#define DLL_STRINGIFY(dll) #dll
#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandleA(DLL_STRINGIFY(dll))
#define DLL_LOAD_LIBRARY(dll) LoadLibraryA(DLL_STRINGIFY(dll))


#define DLL_LOAD_PREFIXNAME(dll, prefixname, name, ret_on_failure) \
do {                                                           \
HMODULE h = DLL_GET_MODULE_HANDLE(dll);                    \
if (!h)                                                        \
h = DLL_LOAD_LIBRARY(dll);                                 \
if (!h) {                                                      \
if (ret_on_failure) { return LIBUSB_ERROR_NOT_FOUND; }     \
else { break; }                                            \
}                                                              \
prefixname = (__dll_##name##_t)GetProcAddress(h,               \
DLL_STRINGIFY(name));                  \
if (prefixname) break;                                         \
prefixname = (__dll_##name##_t)GetProcAddress(h,               \
DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \
if (prefixname) break;                                         \
prefixname = (__dll_##name##_t)GetProcAddress(h,               \
DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \
if (prefixname) break;                                         \
if(ret_on_failure)                                             \
return LIBUSB_ERROR_NOT_FOUND;                             \
} while(0)


#define DLL_DECLARE(api, ret, name, args)   DLL_DECLARE_PREFIXNAME(api, ret, name, name, args)
#define DLL_LOAD(dll, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, name, name, ret_on_failure)
#define DLL_DECLARE_PREFIXED(api, ret, prefix, name, args)   DLL_DECLARE_PREFIXNAME(api, ret, prefix##name, name, args)
#define DLL_LOAD_PREFIXED(dll, prefix, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, prefix##name, name, ret_on_failure)


example:

DLL_DECLARE(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES));
DLL_DECLARE(WINAPI, VOID, HidD_GetHidGuid, (LPGUID));
DLL_DECLARE(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *));

DLL_DECLARE(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA));


use:

DLL_LOAD(hid.dll, HidD_GetAttributes, TRUE);
DLL_LOAD(hid.dll, HidD_GetHidGuid, TRUE);
DLL_LOAD(hid.dll, HidD_GetPreparsedData, TRUE);
DLL_LOAD(hid.dll, HidD_FreePreparsedData, TRUE);