window动态调用第三方库

mac2026-05-18  5

前言: 

最近项目紧急,有一段时间没写博客了。在项目开发过程中,同事问了一个问题,我尝试给他解决后,在此记录一下。

在项目中,我针对二种不同的设备,给上层封装了一套C接口,即使用同一个头文件,调用不同的驱动库,即可对设备进行操作。同事在编写上层应用时,不知道如何调用。本文讲述的一个方法是使用【LoadLibrary】、【GetProcAddress】、【FreeLibrary】来解决这个问题,接下来请看部分代码实现。

接口头文件部分

#ifndef TEST_STORE_H #define TEST_STORE_H #ifdef _WIN32 #ifndef TEST_API #define TEST_API __declspec(dllexport) #endif #else #define TEST_API #endif typedef void ** QHANDLES; #ifdef __cplusplus extern "C" { #endif /******************************************************************************* * Function Name : TEST_EnumStoreHandle * Description : * Input : phStoreHandle : 值为0 * Output : phStoreHandle : 安全存储区句柄列表,使用TEST_QHANDLE_Free释放 * Return : 成功返回安全存储区个数, 其它返回错误值 *******************************************************************************/ TEST_API int TEST_EnumStoreHandle(QHANDLES *phStoreHandles); #ifdef __cplusplus } #endif /* #ifdef __cplusplus */ #endif /* #ifndef TEST_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 (*TEST_EnumStoreHandle_p)(THANDLES *phStoreHandles); void test_qtf_enum() { int ret = 0, devnum = 0; THANDLES phStoreHandles = 0; int i = 0; HINSTANCE hDLL = 0; TEST_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 = (TEST_EnumStoreHandle_p)GetProcAddress(hDLL, "TEST_EnumStoreHandle"); /* 枚举设备 */ ret = pfun(&phStoreHandles); FreeLibrary(hDLL); if (ret <= 0) { printf("warn: no dev\n"); return; } else { printf("info: enum %d dev\n", ret); } }

 

最新回复(0)