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