MFC靜態載入dll和動態載入dll示例
一、靜態載入DLL
函式的定義和使用方法:
第一步:
執行AppWizard,定義專案名為mydll,選擇MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在這個例子中,只有一個AppWizard螢幕出現,選擇MFC擴充套件DLL(MFC Extension DLL (using shared MFC DLL),點選FINISH生成工程。
第三步:
點選File中的New,選擇C/C++ Header File,File Name中輸入dll,點選OK,建立dll.h。輸入extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3);
第四步:
點選File中的New,選擇C++ Source File,File Name中輸入dll,點選OK,建立dll.cpp。輸入
#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
編譯生成mydll.dll和mydll.lib。
第五步:
選擇Project 中Add To Project 中的New , 重新生成一個工程,選擇MFC AppWizards(exe),專案名為
第六步:
拷貝…/mydll/debug/mydll.dll 到 ../mydlltest/debug/下,拷貝…/mydll/debug/mydll.lib到…/mydlltest/目錄下。
第七步:
在mydlltestView.cpp中的#endif下新增
extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void CMydlltestView::OnDraw(CDC* pDC)中新增程式碼如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int x=fun(1,2,3);
CString str;
str.Format("%d",x);
pDC->TextOut(10,10,str);
}
第八步:
在WorkSpace中的mydlltest files上點選右鍵,選擇Add files to Project ,將mydll.lib新增到工程。
至此,靜態載入dll工作已完成。
二、動態載入DLL
從靜態載入的步驟六開始:
在void CMydlltestView::OnDraw(CDC* pDC)中新增程式碼如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int x;
typedef int(*padd)(int x1,int x2,int x3);
HINSTANCE hdll;
padd add;
hdll = LoadLibrary("mydll.dll");
add =(padd)GetProcAddress(hdll,"fun");
x = add(2,6,5);
CString str;
str.Format("%d",x);
pDC->TextOut(10,10,str);
}
在WorkSpace中的mydlltest files上點選右鍵,選擇Add files to Project ,將mydll.lib新增到工程。
三、動態載入和靜態載入區別:
靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib中的指令都被直接包含在最終生成的EXE檔案中了。但是若使用DLL,該DLL不必被包含在最終EXE檔案中,EXE檔案執行時可以“動態”地引用和解除安裝這個與EXE獨立的DLL檔案。靜態連結庫和動態連結庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結庫或者靜態庫,而在動態連結庫中還可以再包含其他的動態或靜態連結庫。
http://blog.csdn.net/m372897500/article/details/7246368
http://blog.csdn.net/m372897500/article/details/7246418
待完善