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);
      }
    }
  • 相关阅读:
    017 文件xfs_repair恢复,xfs_dump恢复,lvm动态扩容
    003 rsync客户端与服务端小脚本
    002 rsync守护进程传输方式详解
    001 期中架构简介、备份初识
    016 netstat、磁盘分区(fdisk、gdisk)
    015 Linux中常用的信号、HUP信号
    014 进程(PS与TOP)
    013 源码安装(Nginx&php为例)
    本地、远程仓库的搭建
    第八章
  • 原文地址:https://www.cnblogs.com/hometown/p/3314663.html
Copyright © 2011-2022 走看看