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);
	}
}

 

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