将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小时内删除。