前言:
最近项目紧急,有一段时间没写博客了。在项目开发过程中,同事问了一个问题,我尝试给他解决后,在此记录一下。
在项目中,我针对二种不同的设备,给上层封装了一套C接口,即使用同一个头文件,调用不同的驱动库,即可对设备进行操作。同事在编写上层应用时,不知道如何调用。本文讲述的一个方法是使用【LoadLibrary】、【GetProcAddress】、【FreeLibrary】来解决这个问题,接下来请看部分代码实现。
接口头文件部分
/*************************************************
Copyright (C), 2009 Qasky Co., Ltd
File name: qcard_store.h
Author: Version: 1.1.0 Date: 2019年5月20日
Description: : 量子移动存储设备应用接口
*************************************************/
#ifndef QCARD_STORE_H
#define QCARD_STORE_H
#ifdef _WIN32
#ifndef QCARD_API
#define QCARD_API __declspec(dllexport)
#endif
#else
#define QCARD_API
#endif
typedef void ** QHANDLES;
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* Function Name : QCard_EnumStoreHandle
* Description : 枚举安全存储区句柄
* Input : phStoreHandle : 值为0
* Output : phStoreHandle : 安全存储区句柄列表,使用QCard_QHANDLE_Free释放
* Return : 成功返回安全存储区个数, 其它返回错误值
*******************************************************************************/
QCARD_API int QCard_EnumStoreHandle(QHANDLES *phStoreHandles);
#ifdef __cplusplus
}
#endif /* #ifdef __cplusplus */
#endif /* #ifndef QCARD_H */
动态调用第三方库源文件部分
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atlbase.h>
#include <atlconv.h>
#include "windows.h"
#include "qcard_store.h"
typedef int (*QCard_EnumStoreHandle_p)(QHANDLES *phStoreHandles);
void test_qtf_enum()
{
int ret = 0, devnum = 0;
QHANDLES phStoreHandles = 0;
int i = 0;
HINSTANCE hDLL = 0;
QCard_EnumStoreHandle_p pfun = 0;
/* 逻辑判断调用对应设备的驱动库位置 */
if(0)
{
SetCurrentDirectory(_T("E:\\Programme\\QUD_QTF_TEST\\qcard_store\\qcard_store\\qtf\\window_x86\\x86_86"));
}
else
{
SetCurrentDirectory(_T("E:\\Programme\\QUD_QTF_TEST\\qcard_store\\qcard_store\\qud\\window_x86\\x86_86"));
}
/* 调用对应设备的驱动库 */
hDLL = LoadLibrary(_T("qcard_store.dll"));
if(hDLL == 0)
{
return;
}
/* 获取库文件的函数地址 */
pfun = (QCard_EnumStoreHandle_p)GetProcAddress(hDLL, "QCard_EnumStoreHandle");
/* 枚举设备 */
ret = pfun(&phStoreHandles);
FreeLibrary(hDLL);
if (ret <= 0)
{
printf("warn: no dev\n");
return;
}
else
{
printf("info: enum %d dev\n", ret);
}
}