2013年3月24日 星期日

學習開發DLL筆記


最近學習用VC來開發Win32 DLL,學了這幾天,來作個總結。
一、生成DLL
1、用VC建立一個Win32DLL工程--DllTest,選上「導出符號」;
2、在DllTest.cpp中編寫導出函數Fun(),這個函數是別的程序要調用的函數:
int fun(int i)
{
return i*i;
}
3、在DllTest.h中聲明導出這個函數:
__declspec(dllexport) int fun(int i);
4、第三步也可以用DEF文件來指定要導出的函數,這樣做可以在程序運行過程中顯式的加載DLL。關於在程序運行過程中顯式的加載DLL見 二、調用DLL
添加一個DEF文件到工程,寫入如下內容:
EXPORTS
Fun
5、編譯這個工程,生成DllTest.dll,同時也生成了DllTest.lib文件。這個文件是供程序開發用的導入庫
二、調用DLL
調用DLL有兩種方法:
裝載期間動態鏈接--模塊可以向調用本地函數一樣調用從其他模塊導出的函數。裝載期間鏈接必須使用DLL的導入庫,也就是.lib文件。它為系統提供了加載這個DLL和定位DLL中的導出函數所需要的信息。
運行期間動態鏈接--程序運行期間可以使用LoadLibrary加載這個DLL,然後調用GetProcAddress函數取得DLL導出函數的地址,然後通過函數地址調用DLL中的函數。
1、裝載期間動態鏈接。
新建一個Win32 Console Application工程--DllApp。把剛才建立的那個工程中的DllTest.dll、DllTest.h和DllTest.lib拷貝到DllApp目錄下。在DllApp.cpp文件中寫入:
#include <windows.h>
#include <stdio.h>
#include "DllTest.h"
//要鏈接到的DllTest.lib庫
#pragma comment(lib,"DllTest.lib")
void main()
{
int a = Fun(2);
printf("The result is %d/n",a);
}
2、運行期間動態加載
新建一個Win32 Console Application工程--DllApp2。把建立的DllTest.dll拷貝到DllApp2目錄中--一定要用在生成DLL部分按照第四步產生的DLL文件,否則程序無法運行。在DllApp2.cpp中寫入:
#include <windows.h>
#include <stdio.h>
typedef void (*PFUN)(int);//聲明函數原型
void main()
{
HMODULE hModule = ::LoadLibrary("DllTest.dll");//加載DLL庫
PFUN newfun = (PFUN)::GetProcAddress(hModule,"fun");//取得fun函數的地址
int i = newfun(2);
printf("The result is %d",i);
::FreeLibrary(hModule);
}

沒有留言:

張貼留言