[00001]-[2015-06-22]-[01]-[MFC动态链接库相关编程]

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工程中定义的类相同的类----->设置为抽象类

【抽象类】 该类不能有对象(实例),唯一的作用就是在于被继承, 一个抽象类至少有一个纯虚函数(没有任何具体实现的虚函数)

      抽象类是一种特殊的类,不能定义对象,作用是用来组织一个继承的层次结构,由他提供一个公共的根(基类),派生其他子类

posted @ 2015-06-27 22:45  Auris  阅读(144)  评论(0编辑  收藏  举报