前言:
最近項目緊急,有一段時間沒寫博客了。在項目開發過程中,同事問了一個問題,我嘗試給他解決後,在此記錄一下。
在項目中,我針對二種不同的設備,給上層封裝了一套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);
}
}