动态加载dll代码

假如动态库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();

 

猜你喜欢

转载自blog.csdn.net/qqwangfan/article/details/79713777
今日推荐