MFC动态链接库的创建与访问
【创建】新建工程MFC AppWizard(dll) 注意FileView视图中的[dll.cpp]和[dll.def]文件
【dll.cpp】 用于实现大部分的功能的文件
【dll.def】
---------------------------------------------------------------------
; 动态链接库1.def : Declares the module parameters for the DLL.
LIBRARY "动态链接库1"
DESCRIPTION ‘动态链接库1 Windows Dynamic Link Library‘
EXPORTS
; Explicit exports can go here 用于声明要导出的函数
ShowDlg;
GetBmpResourceFromDll;
CreateSkinObj;
ReleaseSkinObj;
---------------------------------------------------------------------
【访问】新建一个工程设计应用程序来访问上个DLL工程产生的dll库文件
class CSkin
{
public:
virtual HBITMAP GetBMP() = 0;
};
typedef VOID (_stdcall *pFun)();
typedef HBITMAP (_stdcall *pFunGetBmp)();
// CSkin* _stdcall CreateSkinObj()
typedef CSkin* (_stdcall *funCreateSkinObj)();
// void _stdcall ReleaseSkinObj(CSkin* pSkin)
typedef void (_stdcall *funReleaseSkinObj)(CSkin* pSkin);
HMODULE hModule = LoadLibrary("F:\\项目(进行)\\VC++项目\\VC++典型模块设计\\动态链接库1\\Debug\\动态链接库1.dll");
funCreateSkinObj CreateSkin;
funReleaseSkinObj ReleaseSkin;
if(hModule)
{
CreateSkin = (funCreateSkinObj)GetProcAddress(hModule, "CreateSkinObj");
ReleaseSkin = (funReleaseSkinObj)GetProcAddress(hModule, "ReleaseSkinObj");
CSkin* pSkin = CreateSkin();
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC);
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
pStatic->SetBitmap(pSkin->GetBMP());
ReleaseSkin(pSkin);
}
FreeLibrary(hModule);
需要掌握的技巧
向动态链接库中添加资源(BMP)同时在应用程序访问dll中的资源
向动态连接库中添加C++类,同时在应用程序中访问dll中的C++类调用方法。。。。
Note: 在向动态链接库中添加类时,如果应用程序需要访问类中的方法,则该方法一定是虚方法,否则应用程序将无法访问动态链接库中的类的方法
为了方便在应用程序中更好的调用dll中定义的类, 我们需要在应用程序工程中定义与dll工程中定义的类相同的类----->设置为抽象类
【抽象类】 该类不能有对象(实例),唯一的作用就是在于被继承, 一个抽象类至少有一个纯虚函数(没有任何具体实现的虚函数)
抽象类是一种特殊的类,不能定义对象,作用是用来组织一个继承的层次结构,由他提供一个公共的根(基类),派生其他子类