程序调用动态链接库中的方法,位图,类

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

 

posted @ 2013-09-11 15:29  hometown  阅读(337)  评论(0编辑  收藏  举报