将DLL封装成OCX
说明文档
1、封装工具
使用Visual C++ 6.0对dll文件进行封装。
2、封装方法
可使用静态调用dll和动态调用dll两种方法调用dll,然后封装各接口函数。
静态调用的前提条件是:厂家提供dll和相关的库文件(.lib)以及头文件(.h)。
动态调用的前提条件是:厂家只提供dll文件
3、封装过程
3.1 动态调用dll封装(以封装浩宁达读写卡dll为例)
3.1.1创建项目
1、打开Visual C++ 6.0,单击file→new单击Project选项卡,选择,弹出如下对话框:
2、输入项目名,单击,出现如下对话框。
单击完成创建一个控件。
3.1.2 创建接口函数
单击菜单栏上的“查看”,选择菜单,选择Automation选项卡,弹出如下对话框:
单击Add Method按钮,弹出如下对话框:
system的头文件在第一个文本框里面输入想要加入的方法名,第三个下拉选框里面选择方法的返回类型。在下面的Parameter list列表框里可以加入该方法要带的参数和参数类型,如果参数要回调,则要选择带指针的类型;单击Edit Code按钮可以开始编写方法。
注:参数类型的选择不多,对于dll中提供的函数参数要挑选适当的类型,然后在接口函数中将其转换为dll函数的参数类型。
3.1.3 编辑接口函数
主要编辑“项目名Ctl.app”中的内容。下面以封装浩宁达提供的卡表操作动态库文件中的读卡函数Read_card为例说明如何封装dll文件。
dll中Read_Card函数:
__stdcall long
Read_Card(HANDLE AHandle, long Port, struct rcStruct *rcS,
char *User_ID,
char *Comm_ID,
char *CycleDisplay,
char *MRData);
ocx中封装的函数
a、定义Read_Card函数
typedef long (CALLBACK* RCard)(long, long, struct rcStruct*FAR,char*FAR,char*FAR,char*FAR,char*FAR);
b、定义自定义的结构体
//读卡结构体(参数)
#pragma pack( push, 1 )
struct rcStruct{
//以下标识数据项不管插没插表都必须返回
long Work_ID; //厂商代码(最大2位十进制数字)
long Prog_ID; //表型代码(最大2位十进制数字)
long Card_ID; //卡型代码(最大2位十进制数字)
long Office_ID; //各供电局的地区代码
//如果没有插表,返回以下参数数据
long Far_ID; //远抄表号。
long Meter_Const; //表常数
long WarnDL1; //一级报警电量(金额)
long WarnDL2; //二级报警电量(金额)
long Max_HoardDL; //最大囤积电量(金额)
long Max_OverDL; //最大透支电量(金额)
double Max_Load; //最大负荷(千瓦)
long PTCT; //倍率
long CBDay; //自动抄表日
long XLDTSJ; //需量递推时间
long Loadwarndelay; //超负荷报警延时
double Price_J; //尖单价
double Price_F; //峰单价
double Price_P; //平单价
double Price_G; //谷单价
double SaleDL; //购电量(金额)
long Sale_Num; //购电次数(购电次数从1起)
//如果插表,返回以下抄表数据
double OverZeroDL_M; //过零电量
double RemainDL_M; //剩余电量
long Sale_Num_M; //表内购电次数(购电次数从1起)。
double Power_Z_M; //总用电量
double Power_J_M; //尖用电量
double Power_F_M; //峰用电量
double Power_P_M; //平用电量
double Power_G_M; //谷用电量
long Read_Year_M; //抄表日期的年
long Read_Mon_M; //抄表日期的月
long Read_Day_M; //抄表日期的日
long Read_Hour_M; //抄表日期的时
long Read_Minute_M; //抄表日期的分
long Read_Second_M; //抄表日期的秒
BOOL CBFlag;//插表标识,true:插表(有电卡),false:没有插表(无电卡)
BOOL TZ_State; //电表允许是否允许跳闸
BOOL CX_State; //表内信息是否允许常显
BOOL SQ_State; //是否允许赊欠
};
#pragma pack( pop )
c、编辑接口函数,调用dll中的函数
//读卡函数
BSTR CHndocxCtrl::ReadCard(long AHandle, long Port)
{
CString strResult;
// TODO: Add your dispatch handler code here
//读取ini配置文件
short port_ini = GetPrivateProfileInt("hndocx","port",0,"C:\\WINDOWS\\system32\\pssts.ini");
struct rcStruct FAR* rcs= new rcStruct;
struct rcStruct rcS;
char link = '/';
long result = (long)999; //初始化返回值result
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论