VS2008 製作類的DLL

 

在網上找了好多製作動態庫的資料都是關於函數動態庫的方法,很少關於類動態庫資料。今天拿到老大的程序,認真研究了一下,發現他是基於抽象類的方法,在dll類裏面聲明一個繼承類並給實例化,在調用的時候需要一個動態庫和一個基類文件。

l  具體生成類DLL方法:

1.         建立一個基於win32的空DLL工程

2.         添加基類頭文件(BaseClass.h

#pragma once

class BaseClass

{

public:

         virtual int _stdcall Add(const int firstData, const int secondData) = 0;

         virtual int _stdcall Mul(const int firstData, const int secondData) = 0;

};

 

extern "C" BaseClass *_stdcall InitBaseClass();//封裝派生類用的函數

3.         添加派生類的頭文件(InheritClass.h

#include "BaseClass.h"

 

class InheritClass:public BaseClass

{

public:

         InheritClass();

         ~InheritClass();

         int _stdcall Add(const int firstData, const int secondData);

         int _stdcall Mul(const int firstData, const int secondData);

 

};

 

4.         添加派生類的函數文件(InheritClass.cpp

#include "BaseClass.h"

#include "InheritClass.h"

#include <stdio.h>

#include <stdlib.h>

 

BaseClass *_stdcall InitBaseClass()

{

         return new InheritClass;

}

InheritClass::InheritClass()

{

 

}

InheritClass::~InheritClass()

{

         delete this;

}

int InheritClass::Add(const int firstData, const int secondData)

{

         return firstData + secondData;

}

int InheritClass::Mul(const int firstData, const int secondData)

{

         return firstData * secondData;

}

5.         添加模塊文件(MakeDll.def

LIBRARY  "MakeDll"

EXPORTS

 InitBaseClass @1 NONAME

 

上面每句話的具體作用參考:

http://blog.csdn.net/zhenxiaohui/archive/2010/06/09/5659342.aspx

 

6.         點擊運行生成MakeDll.dllMakeDll.lib

l  動態庫測試

1.         建一個基於對話框的工程,並添加四個按鍵(鏈接動態庫、測試加法、測試減法和斷開連接)和兩個編輯框(顯示加法結果和減法結果)

2.         添加代碼:

TestDllDlg.h文件:

聲明公共類型:

HMODULE m_hMakeDll;

BaseClass *m_pBaseClass;

int m_iFirstData;

int m_iSecondData;

typedef BaseClass *_stdcall InitBaseClass();

 

TestDllDlg.cpp文件:

void CTestDllDlg::OnBnClickedBtestlink()

{

         m_hMakeDll = LoadLibrary("MakeDll.dll");

         if (m_hMakeDll == NULL)

         {

                   MessageBox(_T("連接動態庫失敗!"));

         }

         else

         {

                   MessageBox(_T("連接動態庫成功!"));

         }

         InitBaseClass * fun = (InitBaseClass *)GetProcAddress(m_hMakeDll,(LPCSTR)1);

         if (fun)

         {

                   m_pBaseClass = fun();

         }

 

         m_iFirstData = 20;

         m_iSecondData = 30;

}

 

void CTestDllDlg::OnBnClickedCancel()

{

         if (m_hMakeDll != NULL)

         {

                   FreeLibrary(m_hMakeDll);

         }       

         OnCancel();

}

 

void CTestDllDlg::OnBnClickedBtestadd()

{

         int tempData = m_pBaseClass->Add(m_iFirstData,m_iSecondData);

         CString str;

         str.Format("%d",tempData);

         GetDlgItem(IDC_EADD)->SetWindowTextA(str);

}

 

void CTestDllDlg::OnBnClickedBtestmul()

{

         int tempData = m_pBaseClass->Mul(m_iFirstData,m_iSecondData);

         CString str;

         str.Format("%d",tempData);

         GetDlgItem(IDC_EMUL)->SetWindowTextA(str);

}

 

void CTestDllDlg::OnBnClickedBtestdling()

{

         if (m_hMakeDll)

         {

                   FreeLibrary(m_hMakeDll);

                   MessageBox(_T("斷開成功!"));

         }

}

 

l  測試結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章