同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数。最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方便的。

不过最多支持5个参数,同学们可以自己加。等着下次用flexbison写一个生成工具,我感觉还是不错的。

 #pragma once
/*! \brief 动态加载dll,并调用导出函数
author:12178761@qq.com
*/
#define DLLLOADER_BEGIN( NAME)\
class DLLLOADER_##NAME\
{\
public:\
static BOOL Init( LPCWSTR sDllPath){\
if ( RefHModule())\
{\
return TRUE;\
}\
RefHModule() = ::LoadLibrary( sDllPath);\
if ( !RefHModule())\
{\
return FALSE;\
}\
return TRUE;\
}\
static void UnInit(){\
if ( RefHModule())\
{\
FreeLibrary( RefHModule());\
RefHModule() = NULL;\
}\
}\
static HMODULE& RefHModule(){\
static HMODULE M = NULL;\
return M;\
}
#define DLLLOADER_ENTRY_0( FUNNAME, FUNDESC, FUNRET, FUNRETDEF)\
typedef FUNRET (FUNDESC *_##FUNNAME)();\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static FUNRET FUNNAME(){\
if ( Ref##FUNNAME())\
{\
return Ref##FUNNAME()();\
}\
return FUNRETDEF;\
}
#define DLLLOADER_ENTRY_VOID0( FUNNAME, FUNDESC)\
typedef void (FUNDESC *_##FUNNAME)();\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static void FUNNAME(){\
if ( Ref##FUNNAME())\
{\
Ref##FUNNAME()();\
}\
}
#define DLLLOADER_ENTRY_1( FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1)\
typedef FUNRET (FUNDESC *_##FUNNAME)(PARAMTYPE1);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static FUNRET FUNNAME( PARAMTYPE1 PARAM1){\
if ( Ref##FUNNAME())\
{\
return Ref##FUNNAME()( PARAM1);\
}\
return FUNRETDEF;\
}
#define DLLLOADER_ENTRY_VOID1( FUNNAME, FUNDESC, PARAMTYPE1)\
typedef void (FUNDESC *_##FUNNAME)(PARAMTYPE1);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static void FUNNAME( PARAMTYPE1 PARAM1){\
if ( Ref##FUNNAME())\
{\
Ref##FUNNAME()( PARAM1);\
}\
}
#define DLLLOADER_ENTRY_2( FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1, PARAMTYPE2)\
typedef FUNRET (FUNDESC *_##FUNNAME)(PARAMTYPE1, PARAMTYPE2);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static FUNRET FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2){\
if ( Ref##FUNNAME())\
{\
return Ref##FUNNAME()( PARAM1, PARAM2);\
}\
return FUNRETDEF;\
}
#define DLLLOADER_ENTRY_VOID2( FUNNAME, FUNDESC, PARAMTYPE1, PARAMTYPE2)\
typedef void (FUNDESC *_##FUNNAME)(PARAMTYPE1, PARAMTYPE2);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static void FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2){\
if ( Ref##FUNNAME())\
{\
Ref##FUNNAME()( PARAM1, PARAM2);\
}\
}
#define DLLLOADER_ENTRY_3( FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1, PARAMTYPE2, PARAMTYPE3)\
typedef FUNRET (FUNDESC *_##FUNNAME)(PARAMTYPE1, PARAMTYPE2, PARAMTYPE3);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static FUNRET FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3){\
if ( Ref##FUNNAME())\
{\
return Ref##FUNNAME()( PARAM1, PARAM2, PARAM3);\
}\
return FUNRETDEF;\
}
#define DLLLOADER_ENTRY_VOID3( FUNNAME, FUNDESC, PARAMTYPE1, PARAMTYPE2, PARAMTYPE3)\
typedef void (FUNDESC *_##FUNNAME)(PARAMTYPE1, PARAMTYPE2, PARAMTYPE3);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static void FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3){\
if ( Ref##FUNNAME())\
{\
Ref##FUNNAME()( PARAM1, PARAM2, PARAM3);\
}\
}
#define DLLLOADER_ENTRY_4( FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1,\
PARAMTYPE2, PARAMTYPE3, PARAMTYPE4)\
typedef FUNRET (FUNDESC *_##FUNNAME)(PARAMTYPE1, PARAMTYPE2, PARAMTYPE3, PARAMTYPE4);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static FUNRET FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4){\
if ( Ref##FUNNAME())\
{\
return Ref##FUNNAME()( PARAM1, PARAM2, PARAM3, PARAM4);\
}\
return FUNRETDEF;\
}
#define DLLLOADER_ENTRY_VOID4( FUNNAME, FUNDESC, PARAMTYPE1,\
PARAMTYPE2, PARAMTYPE3, PARAMTYPE4)\
typedef void (FUNDESC *_##FUNNAME)(PARAMTYPE1, PARAMTYPE2, PARAMTYPE3, PARAMTYPE4);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static void FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4){\
if ( Ref##FUNNAME())\
{\
Ref##FUNNAME()( PARAM1, PARAM2, PARAM3, PARAM4);\
}\
}
#define DLLLOADER_ENTRY_5( FUNNAME, FUNDESC, FUNRET, FUNRETDEF, PARAMTYPE1,\
PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5)\
typedef FUNRET (FUNDESC *_##FUNNAME)(PARAMTYPE1, \
PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static FUNRET FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, \
PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4, PARAMTYPE5 PARAM5){\
if ( Ref##FUNNAME())\
{\
return Ref##FUNNAME()( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5);\
}\
return FUNRETDEF;\
}
#define DLLLOADER_ENTRY_VOID5( FUNNAME, FUNDESC, PARAMTYPE1,\
PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5)\
typedef void (FUNDESC *_##FUNNAME)(PARAMTYPE1, \
PARAMTYPE2, PARAMTYPE3, PARAMTYPE4, PARAMTYPE5);\
static _##FUNNAME Ref##FUNNAME(){\
_##FUNNAME F = (_##FUNNAME)::GetProcAddress( RefHModule(), #FUNNAME);\
return F;\
}\
static void FUNNAME( PARAMTYPE1 PARAM1, PARAMTYPE2 PARAM2, \
PARAMTYPE3 PARAM3, PARAMTYPE4 PARAM4, PARAMTYPE5 PARAM5){\
if ( Ref##FUNNAME())\
{\
Ref##FUNNAME()( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5);\
}\
}
#define DLLLOADER_END()\
}; /*
例子:
DLLLOADER_BEGIN( SAMPLE)
DLLLOADER_ENTRY_0( Function1, BOOL, FALSE, )
DLLLOADER_ENTRY_VOID0( Function2, )
DLLLOADER_ENTRY_1( Function3, BOOL, FALSE, , LPCWSTR)
DLLLOADER_END() DLLLOADER_BEGIN(KERNEL32)
DLLLOADER_ENTRY_1( LoadLibraryW, WINAPI, HMODULE, 0, LPCWSTR)
DLLLOADER_ENTRY_3( GetModuleFileNameW, WINAPI, DWORD, 0, HMODULE, LPWSTR, DWORD)
DLLLOADER_END() int _tmain(int argc, _TCHAR* argv[])
{
DLLLOADER_SAMPLE::Init( L"C:\\Users\\sosopop\\Documents\\Visual Studio 2005\\Projects\\testHandle\\debug\\testLoadDll.dll");
DLLLOADER_SAMPLE::Function1();
DLLLOADER_SAMPLE::Function2();
DLLLOADER_SAMPLE::Function3(L"Function3 Hello");
DLLLOADER_SAMPLE::Function4(L"Function4", L"Hello");
DLLLOADER_SAMPLE::UnInit(); DLLLOADER_KERNEL32::Init( L"c:\\windows\\system32\\kernel32.dll");
HMODULE h =DLLLOADER_KERNEL32::LoadLibraryW( L"user32.dll");
WCHAR sFileName[MAX_PATH]={0};
DWORD nSize = DLLLOADER_KERNEL32::GetModuleFileNameW( NULL, sFileName, _countof(sFileName)); return 0;
}
*/

用宏定义封装LoadLibrary,方便的动态加载dll的更多相关文章

  1. Delphi静态加载DLL和动态加载DLL示例

    下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...

  2. c#实现动态加载Dll(转)

    c#实现动态加载Dll 分类: .net2009-12-28 13:54 3652人阅读 评论(1) 收藏 举报 dllc#assemblynullexceptionclass 原理如下: 1.利用反 ...

  3. 动态加载dll的实现+远线程注入

    1.在目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 之前可以看到shellcode很难编写还要去依赖库,去字符串区等等 ...

  4. C# 利用反射动态加载dll

    笔者遇到的一个问题,dll文件在客户端可以加载成功,在web端引用程序报错.解决方法:利用反射动态加载dll 头部引用加: using System.Reflection; 主要代码: Assembl ...

  5. unity3d动态加载dll的API以及限制

    Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...

  6. Unity3D的坑系列:动态加载dll

    我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码 ...

  7. C#,动态加载DLL,通过反射,调用参数,方法,窗体

    .net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System. ...

  8. 动态加载Dll时,通过Type生成类对象

    原文:动态加载Dll时,通过Type生成类对象 转:http://www.cnblogs.com/zfanlong1314/p/4197383.html "反射"其实就是利用程序集 ...

  9. c#实现动态加载Dll

    原文:c#实现动态加载Dll 原理如下: 1.利用反射进行动态加载和调用. Assembly assembly=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将 ...

随机推荐

  1. linux 压缩与解压缩

    tar 命令详解  -c: 建立压缩档案   -x:解压   -t:查看内容   -r:向压缩归档文件末尾追加文件   -u:更新原压缩包中的文件   这五个是独立的命令,压缩解压都要用到其中一个,可 ...

  2. C#将html导出到word(基于wps)

    由于客户需要,我们需要实现将网页导出到word中的功能,在此过程中,尝试使用过openoffice.itext.wordapi等各种方法,都不尽如人意.openoffice导出的问题图片信息在word ...

  3. 使用.net(C#)发送邮件学习手册(带成功案例)

    使用.net(C#)发送邮件学习手册(带成功案例) 1.了解发送邮件的三种方式 2.实例介绍使用client.DeliveryMethod = System.Net.Mail.SmtpDelivery ...

  4. 初识ASP.NET---若干常见错误

    近期在学习ASP.NET的相关知识,期间遇到了一些错误,比較常见的错误总结了一下,希望此文能给ASP.NET刚開始学习的人一些帮助.同一时候记录这些错误也方便今后自己查看. 1.  GridView& ...

  5. 都是类型惹的祸——小心unsigned

    正如我们所知道的,编程语句都有很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigned修饰,如unsigned int等.大家有没想 ...

  6. android之存储篇——SQLite数据库

    转载:android之存储篇_SQLite数据库_让你彻底学会SQLite的使用 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在In ...

  7. Makefile 中会在多处地方看到 FORCE

    转载:http://blog.csdn.net/wzw88486969/article/details/11739737 在内核的 Makefile 中会在多处地方看到 FORCE ,比如: # vm ...

  8. 关于InputStream 和String对象之间的相互转换

    代码如下: package com.xin.stream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; im ...

  9. 收藏一部山地车教学视频,Fabien Barel主讲及动作示范

    视频是由曾多次获得UCI速降赛的冠军车手Fabien Barel主讲及动作示范,讲解山地车越野的装备以及基本动作.视频中的要点说明我已经手录为文本,如果视频中没有看清的地方,也可以看文字. 骑行装备 ...

  10. Java快速入门

    Java 是什么? Java 的特点: 面向对象 平台无关(跨平台): 简单 安全 体系结构 - 中性 可移植 健壮 多线程 解释型 高性能 分布式 动态 Java环境设置: Java SE可免费提供 ...