[代码生成器] 二. 动态加载DLL的代码自动生成

动态加载dll场景1:
      有两组DLL(lib, h, dll 三个文件), 功能不同, 但名字却相同.(当然, 把这3个文件的名称改了, 用静态加载可能也可以, 没试过).

动态加载dll场景2:
      没有lib文件.

动态加载dll场景3:
      有a.dll, b.dll, 但可能在时间1你需要使用a.dll, 在时间2你需要使用b.dll. 所以程序不需要一运行就同时加载两个dll,
而采取动态加载的方式.

动态加载dll 需要LoadLibrary, 声明函数变量等, 如果动态加载的dll有上千个函数, 或者有几十个dll需要动态加载, 那工作量也是比较大的.
因此写了一个代码自动生成工具.

 

1. 类名: 输入一个字符 产生一个类名,
   例如输入DLL1, 则产生类名 CDLL1Loader, 将自动生成这个类, 类中包含LoadLibrary部分和FreeLibrary部分. 分别用于调用LoadLibrary和GetProcAddress来动态调用dll

2. H配置文件格式就是函数的声明, 一行一个函数例如
    文件 text.ini有两行这样的数据
    int Fun1(int nP1);
    void Fun2(double dP1);

分析出所有行(需要的函数)的返回值, 函数名, 参数. 自动生成加载代码(我的资源中有)

3. 生成h和cpp文件

.h中
// 函数类型
typedef int (__stdcall *Fun1_)(int nP1);
typedef void (__stdcall *Fun2_)(double dP1);

// 函数变量(CDLL1Loader的成员)
Fun1_ Fun1;
Fun2_ Fun2;

.cpp中
// 动态加载代码

m_hDll = ::LoadLibraryA("DLLPathName");
if(m_hDll == 0)
{
 return;
}
Fun1 = (Fun1_)::GetProcAddress(m_hDll, "Fun1");
Fun2 = (Fun2_)::GetProcAddress(m_hDll, "Fun2");

// 详细看下面文件

4. 调用
CDLL1Loader dllLoader;

dllLoader.LoadLibrary("DLLPathName");
...
dllLoader.Fun1(1);
dllLoader.Fun2(1.5);

// 这样子调用有点麻烦, 总是带上dllLoader, 再优化一下
定义如下宏
#ifdef DYN_LOAD_DLL
#define Fun1 dllLoader.Fun1
#define Fun2 dllLoader.Fun2
#else
#define Fun1 Fun1
#define Fun2 Fun2
#endif

// 这样就可以不带上dllLoader了. 而且如果需要转入静态加载, 也很方便.

 

 这是生成的类文件和text.ini文件

http://download.youkuaiyun.com/detail/cay22/4916306

 

这个工具的代码主要就是写文件功能了, 关键是你写入文件的内容, 内容就要看你的设计需求了.

因为代码涉及到工作内容, 所以...

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值