zoukankan      html  css  js  c++  java
  • 程序调用动态链接库中的方法,位图,类

    1.  添加MFC Dll项目。

    在全局区域添加需要用到的方法、类等信息。 

    void _stdcall ShowDlg()
    {
        AfxMessageBox(_T("动态链接库中的Dll对话框!"));
    }
    //-------------------------------//
    HBITMAP _stdcall GetBitmapFromDll()
    {
        return LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP_W));//IDB_BITMAP_W位图ID
    }
    //--------------------------------//
    class CSkin
    {
    public:
        virtual HBITMAP GetBkMap()
        {
            return LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP_W));
            //在向动态链接库中添加类时,如果应用程序要访问类中的方法,则方法必须是虚方法。
        }
    };
    
    CSkin * _stdcall GetSkobj()
    {
        return new CSkin(); //构建CSkin对象
    }
    
    void _stdcall RealeaseSkobj(CSkin * cs)
    {
        delete cs;    //释放CSkin对象
        cs=0;
    }

    找到项目中扩展名为“.def”的文件,在EXPORTS中导出需要的函数。

    ; SkinDll.def : 声明 DLL 的模块参数。
    
    LIBRARY      "SkinDll"
    
    EXPORTS ShowDlg;
            GetBitmapFromDll;
            GetSkobj;
            RealeaseSkobj
        ; 此处可以是显式导出

    2.  对上个项目编译完成后,添加MFC应用程序,此处为对话框应用程序。

             在界面上添加一个图片控件,并添加一个变量CStatic 类型的m_bit。

    typedef void (_stdcall *funShowDlg)();
    typedef HBITMAP (_stdcall *funGetBitFromDll)();
    
    void CSlinMainDlg::OnBnClickedOk() 
    {
        // TODO: 在此添加控件通知处理程序代码
        HMODULE hMod=LoadLibrary(_T("SkinDll.dll"));
        funShowDlg ShowDlg;
        if(hMod)
        {
            ShowDlg=(funShowDlg)GetProcAddress(hMod,"ShowDlg");
            if(ShowDlg)
            {
    ShowDlg();
            }
            FreeLibrary(hMod);
        } 
    }
    
    void CSlinMainDlg::OnBnClickedButton1()
    {
        // TODO: 在此添加控件通知处理程序代码
        HMODULE hMod=LoadLibrary(_T("SkinDll.dll"));
        funGetBitFromDll GetBmp; //定义函数指针
        if(hMod)
        {
            GetBmp=(funGetBitFromDll)GetProcAddress(hMod,"GetBitmapFromDll");
            if(GetBmp)
            {
                HBITMAP hMap=GetBmp();
                 m_bit.SetBitmap(hMap);
            }
            FreeLibrary(hMod);
        } 
    }
    //-------------------------------------------------
    class CSkin
    {
        public :
            virtual HBITMAP GetBkMap()=0;
    };
    
    typedef CSkin* (_stdcall *funGetSkobj)();
    typedef void (_stdcall *funRealeaseSkobj)(CSkin * cs);
    
    void CSlinMainDlg::OnBnClickedBtnC()
    {
        // TODO: 在此添加控件通知处理程序代码
      HMODULE hMod=LoadLibrary(_T("SkinDll.dll"));
      funGetSkobj Getobj;
      funRealeaseSkobj Realeaseobj;
      if(hMod)
      {
          Getobj=(funGetSkobj)GetProcAddress(hMod,"GetSkobj");
          Realeaseobj=(funRealeaseSkobj)GetProcAddress(hMod,"RealeaseSkobj");
            if(Getobj)
            {
                CSkin * skin=Getobj();
                m_bit.SetBitmap(skin->GetBkMap());
                Realeaseobj(skin);
            }
            FreeLibrary(hMod);
      }
    }
  • 相关阅读:
    有限制的最大连续和问题
    Codevs 5056 潜水员
    Codevs 1958 刺激
    Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组
    [NOIP2014]解方程
    Codevs 3729 飞扬的小鸟
    Codevs 1689 建造高塔
    Codevs 2102 石子归并 2
    C语言基础之进制的那些事(1)
    指针
  • 原文地址:https://www.cnblogs.com/hometown/p/3314663.html
Copyright © 2011-2022 走看看