初始代码
以下代码封装了rf_init_com和rf_get_device_number函数,并通过定义Device类的方式,使得这两个函数可以在类的实例化时被自动调用,并在析构时释放相应资源。
在main函数中,通过实例化Device类来调用getDeviceNumber函数,从而获取设备标识。你也可以进一步扩展这个类,来支持更多的功能。
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include "ExportFunc.h"
#pragma comment(lib, "MasterRD.dll")
class Device {
public:
Device()
{
// 加载库文件
hDll = LoadLibrary(L"MasterRD.dll");
if (!hDll)
{
printf("加载库文件失败\n");
return;
}
// 获取rf_init_com函数指针
rf_init_com = (RF_INIT_COM)GetProcAddress(hDll, "rf_init_com");
if (!rf_init_com)
{
printf("获取rf_init_com函数指针失败\n");
return;
}
// 获取rf_get_device_number函数指针
rf_get_device_number = (RF_GET_DEVICE_NUMBER)GetProcAddress(hDll, "rf_get_device_number");
if (!rf_get_device_number)
{
printf("获取rf_get_device_number函数指针失败\n");
return;
}
// 初始化串口
int port = 3;
long baud = 115200;
int ret = rf_init_com(port, baud);
if (ret == 0)
{
printf("初始化串口成功\n");
}
else
{
printf("初始化串口失败\n");
}
}
~Device()
{
if (hDll)
{
FreeLibrary(hDll);
}
}
int getDeviceNumber()
{
unsigned short Icdev;
int ret = rf_get_device_number(&Icdev);
printf("rf_get_device_number返回值:%d,设备标识:%d\n", ret, Icdev);
return ret;
}
private:
HINSTANCE hDll; // 库句柄
typedef int(WINAPI* RF_INIT_COM)(int, long);
RF_INIT_COM rf_init_com; // 函数指针类型
typedef int(WINAPI* RF_GET_DEVICE_NUMBER)(unsigned short*);
RF_GET_DEVICE_NUMBER rf_get_device_number; // 函数指针类型
};
int main()
{
Device device;
if (!device.getDeviceNumber())
{
printf("获取设备标识成功\n");
}
else
{
printf("获取设备标识失败\n");
}
return 0;
}
以下是添加功能函数
比如我需要取得读写卡器硬件版本号
引入该函数指针类型
获取函数指针
增加实现方法函数
也可加入形参
最后实现结果
最后完整代码如下
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include "ExportFunc.h"
#pragma comment(lib, "MasterRD.dll")
class Device {
public:
Device()
{
// 加载库文件
hDll = LoadLibrary(L"MasterRD.dll");
if (!hDll)
{
printf("加载库文件失败\n");
return;
}
// 获取rf_init_com函数指针
rf_init_com = (RF_INIT_COM)GetProcAddress(hDll, "rf_init_com");
if (!rf_init_com)
{
printf("获取rf_init_com函数指针失败\n");
return;
}
// 获取rf_get_device_number函数指针
rf_get_device_number = (RF_GET_DEVICE_NUMBER)GetProcAddress(hDll, "rf_get_device_number");
if (!rf_get_device_number)
{
printf("获取rf_get_device_number函数指针失败\n");
return;
}
/******** 功能:取得读写卡器硬件版本号,2 字节 ***********/
// 参数:icdev: 通讯设备标识符
// Version:存放返回版本信息
// 返回:成功则返回0
/*********************************************************/
//static int (WINAPI * rf_get_model)(unsigned short icdev, unsigned short* Version);
rf_get_model = (RF_GET_MODEL)GetProcAddress(hDll, "rf_get_model");
if (!rf_get_model)
{
printf("获取rf_get_model函数指针失败\n");
return;
}
// 初始化串口
int port = 3;
long baud = 115200;
int ret = rf_init_com(port, baud);
if (ret == 0)
{
printf("初始化串口成功\n");
}
else
{
printf("初始化串口失败\n");
}
}
~Device()
{
if (hDll)
{
FreeLibrary(hDll);
hDll = NULL;
}
}
int getDeviceNumber()
{
unsigned short Icdev;
int ret = rf_get_device_number(&Icdev);
printf("rf_get_device_number返回值:%d,设备标识:%d\n", ret, Icdev);
return ret;
}
//实现方法
int getModel()
{
unsigned short Icdev;
int ret = rf_get_device_number(&Icdev);
if (ret != 0)
{
printf("rf_get_device_number返回值:%d,设备标识:%d\n", ret, Icdev);
return ret;
}
unsigned short Version;
ret = rf_get_model(Icdev, &Version);
printf("rf_get_model返回值:%d,硬件版本号:%d\n", ret, Version);
return ret;
}
private:
HINSTANCE hDll; // 库句柄
typedef int(WINAPI* RF_INIT_COM)(int, long);
RF_INIT_COM rf_init_com; // 函数指针类型
typedef int(WINAPI* RF_GET_DEVICE_NUMBER)(unsigned short*);
RF_GET_DEVICE_NUMBER rf_get_device_number; // 函数指针类型
typedef int(WINAPI* RF_GET_MODEL)(unsigned short, unsigned short*);
RF_GET_MODEL rf_get_model;
};
int main()
{
Device device;
if (!device.getDeviceNumber())
{
printf("获取设备标识成功\n");
}
else
{
printf("获取设备标识失败\n");
}
//取得读写卡器硬件版本号
if (!device.getModel())
{
printf("取得读写卡器硬件版本号成功\n");
}
else
{
printf("取得读写卡器硬件版本号失败\n");
}
return 0;
}