假如动态库add.dll接口如下:
BOOL ADD();
void PLUS();
则动态加载动态库代码.h文件如下:
#pragma once
#include <Windows.h>
#ifdef __cplusplus
extern "C"{
#endif
typedef BOOL(*pf_ADD)();
typedef void (*pf_PLUS)();
class CompareSdk
{
public:
CompareSdk();
~CompareSdk();
CompareSdk(const CompareSdk &sdk) = delete;
CompareSdk& operator=(const CompareSdk &sdk) = delete;
bool Init();
void UnInit();
static CompareSdk* Instance(){ return m_Instance; }
public:
// 对应的接口
pf_ADD m_pf_ADD = nullptr;
pf_PLUS m_pf_PLUS = nullptr;
private:
HMODULE m_hdll;
// 自动删除
class AutoDel
{
public:
AutoDel(){}
~AutoDel()
{
if (m_Instance != nullptr)
{
delete m_Instance;
m_Instance = nullptr;
}
}
};
static AutoDel m_autoDel;
private:
static CompareSdk* m_Instance;
};
#ifdef __cplusplus
}
#endif
/.cpp实现如下:
#include <string>
#include "CompareSDK.h"
CompareSdk* CompareSdk::m_Instance = new CompareSdk();
CompareSdk::CompareSdk()
{
}
CompareSdk::~CompareSdk()
{
}
bool CompareSdk::Init()
{
// 取得动态库路径
//HMODULE module = GetModuleHandleA("add.dll");
char buf[MAX_PATH + 1] = { 0 };
GetModuleFileNameA(/*module*/NULL, buf, MAX_PATH);
std::string str(buf);
std::string::size_type pos = str.find_last_of("\\");
std::string dllpath = str;
if (pos != std::string::npos)
{
dllpath = str.substr(0, pos);
}
dllpath += "\\cmpSdk\\add.dll";
// 设置当前动态库路径后再加载动态库
bool bsucc = SetDllDirectoryA(dllpath.c_str());
m_hdll = LoadLibraryExA(dllpath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);//LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始
DWORD ret = GetLastError();
printf("LoadLibraryA path[%s] %s, err[%d]", dllpath.c_str(), m_hdll == NULL ? "fail" : "succ",ret);
if (m_hdll == nullptr)
{
return false;
}
// 加载对应接口
m_pf_ADD = (pf_ADD)GetProcAddress(m_hdll, "ADD");
m_pf_PLUS = (pf_PLUS)GetProcAddress(m_hdll, "PLUS");
if(m_pf_ADD == nullptr ||
m_pf_PLUS == nullptr)
{
return false;
}
return true;
}
void CompareSdk::UnInit()
{
if (m_hdll != nullptr)
{
FreeLibrary(m_hdll);
m_hdll = nullptr;
}
}
// 调用
CompareSdk::Instance()->Init(); // 加载动态库
// 调用动态库函数
CompareSdk::Instance()->m_pf_ADD();
CompareSdk::Instance()-m_pf_PLUS();
//使用完后释放资源
CompareSdk::Instance()->UnInit();
动态加载dll代码
最新推荐文章于 2025-04-04 01:37:13 发布