window動態調用第三方庫

前言: 

最近項目緊急,有一段時間沒寫博客了。在項目開發過程中,同事問了一個問題,我嘗試給他解決後,在此記錄一下。

在項目中,我針對二種不同的設備,給上層封裝了一套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);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章