在網上找了好多製作動態庫的資料都是關於函數動態庫的方法,很少關於類動態庫資料。今天拿到老大的程序,認真研究了一下,發現他是基於抽象類的方法,在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.dll和MakeDll.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 測試結果