C++动态加载(显式链接)使用类接口

C++动态加载(显式链接)使用类接口

使用windows下的工程 ,动态加载DLL(显示链接),灵活性更好,相比隐式链接,无需在工程设置.lib

示例:

代码片 dll 中的 getestui.h. 自己在VS中设置会生成的dll叫 getest.dll

// 需要使用虚基表的方法,才能动态加载时,使用类的接口

# ifdef BUILD_GAMEECOLOGY_DLL
#   define GAMEECOLOGY_EXPORT __declspec(dllexport)
# else
#  define GAMEECOLOGY_EXPORT __declspec(dllimport)
# endif // BUILD_GAMEECOLOGY_DLL

class GeTestUI 
{
public:
	GeTestUI();

	virtual void creatMessage();//注意要用虚函数

	virtual void deleteSelf();//注意要用虚函数
};

extern "C" GAMEECOLOGY_EXPORT GeTestUI *createGeTestUiObject();//对外提供构造函数

代码片 dll 中的 getestui.cpp

#include "getestui.h"

GeTestUI::GeTestUI()
{

}

void GeTestUI::creatMessage()
{
	//QMessageBox::warning(0, "hello", "Test Now!!"); 写一些代码
}

void GeTestUI::deleteSelf(void)
{
	delete this;
}

GeTestUI *createGeTestUiObject()
{
	return new GeTestUI();
}

外部工程的main.cpp使用动态加载.

// 
	typedef GeTestUI* (CREATEFN)(void);
	HMODULE  hModule = LoadLibraryEx(L"getest.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
	CREATEFN* pfn;
	pfn=(CREATEFN *)::GetProcAddress(hModule,"createGeTestUiObject");
	GeTestUI *testUi = pfn();
	testUi->creatMessage();//这里就是要使用 virtual ,虚基表的机制,不然会编译出错
	testUi->deleteSelf();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章