#pragma once
#include<windows.h>
//#include<w中>,只三个,暂时不加处理
类 动调{//应该是一个dll对应一个动调
H模块 针;无序映<串,远过程>库;
公:
~动调(){卸载();}
显 动调(常 符*径){串 a=径;初化(a);}
显 动调(串&径){初化(径);}
空 初化(串&径){
针=加载库(径.c串());
如(空针==针){打印("加载失败\n");抛 0;}
}//直接抛就行0
极 卸载(){
如(针==空针)中 真;
动 b=释放库(针);如(!b)中 假;针=空针;中 真;
}
元<型名 T>动 取函数(常 符*a){
串 b=a;中 取函数<T>(b);
}//这里要<T>
元<型名 T>函数<T>取函数(串&名){//没必要是常串
动 i=库.查找(名);
如(i==库.尾()){
动 d=取过程地址(针,名.c串());
如(!d)中 空针;压(库,名,d);
i=库.查找(名);
}//d为地址
中((T*)(i->第二));
}//T就是函数签名,最后自动转换成(函数<T>)了
元<型名 T,型名...O>结果型<函数<T>(O...)>
执行(常 符*名,O&&...o){//串/符*
串 a=名;中 执行<T,O...>(a,前向<O>(o)...);
}
元<型名 T,型名...O>结果型<函数<T>(O...)>
执行(串&名,O&&...o){
动 f=取函数<T>(名);
如(f==空针){
串 s="找不到函数"+名;抛 异常(s.c串());
}
中 f(前向<O>(o)...);
}
};
示例:
#define NOMINMAX
//去掉最小最大冲突
#include <windows.h>
#include <stdio.h>
//
#include <常用>
#include "动调.cpp"
空 主(){
动调 p{"动态.dll"};
动 t=p.取函数<符*()>("aa");
打印(t());
符*b=p.执行<符*()>("aa");
打印(b);
}