动态调用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);
- 动态调用DLL的方法(宏实现)
- 关于动态调用Dll的方法
- C#动态调用c++DLL的方法
- 动态链接库(dll)的调用方法
- 关于动态调用Dll的方法
- C#动态调用c++DLL的方法
- VC动态调用DLL的调试方法
- VC动态调用DLL的调试方法
- Delphi中动态调用DLL的方法
- Delphi中动态调用DLL的方法
- C# 实现动态调用DLL的研究
- DLL的动态调用
- dll的动态调用
- C#实现反射调用动态加载的DLL文件中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- c# 动态加载dll文件,并实现调用其中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- IE10的CSS技巧(IE10专属css hack写法)
- javascript 读取json对象
- 关于phpcms2008 内部递增标变量 $n 的注意事项
- hdu 1016 (DFS)
- 调试存储过程:ORA-0131 Insufficient privileges 处理
- 动态调用DLL的方法(宏实现)
- FORM触发器
- Mirror v0.2 Preview 2 发布
- sed命令详解
- Hadoop+Mahout安装手记
- [apk破解]Awind公司的Mirrorop Sender 1.1.0.8
- 表单target用法(页面提交表单无刷新)
- Android 开发笔记
- 存储结构