动态加载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
这个工具的代码主要就是写文件功能了, 关键是你写入文件的内容, 内容就要看你的设计需求了.
因为代码涉及到工作内容, 所以...