標籤:blog http 使用 os io 檔案 for ar
動態連結程式庫的建立
fangyukuan
2010.6.20
編寫DLL時的函數與一般的函數方法基本一樣。但要對庫中的函數進行必要的聲明,以說明哪些函數是可以匯出的,哪些函數是不可以匯出的。
把DLL中的函式宣告為匯出函數的方法有兩種:
一是使用關鍵字_declspec(dllexport)來聲明。
二是在.def檔案中聲明。
一、使用關鍵字_declspec(dllexport)來聲明匯出函數
聲明函數SayHello為匯出函數語句為:int _declspec(dllexport) SayHello ();
為了使一個用C++語言編寫的DLL函數可以在C語言編寫的應用程式中使用,在關鍵字_declspec(dllexport) 之前要附加另一個關鍵字:extern “C”,以通知編譯器採用C連結方式。
例子:(用vs2008寫的例子)
建立一個工程。
選擇Win32 Project,工程名字為1_DLLDemo。確定。
選擇DLL其它預設。
在檔案1_DLLDemo.cpp編寫代碼如下:
extern "C" __declspec(dllexport) void SayHello()
{
::MessageBoxW(NULL, L"Hello", L"fangyukuan", MB_OK);
}
按F7編譯即可。
再建立一個測試工程。這裡簡單一點,建立一個控制台工程就可以了。
選擇Win32 console Application,其它全部預設。
編寫如下代碼:
#include "stdafx.h"
#include "stdlib.h" // for system("pause");
#include "windows.h"
#include <iostream>
using namespace std;
typedef void (SAYHELLO)(); // 定義一個這種類型的函數指標
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDllInst;
// 這裡為dll的路徑,因為現在exe和dll在同一個目錄下,所以唯寫名字即可
hDllInst=LoadLibrary(L"1_DLLDemo.dll");
if(NULL == hDllInst)
{
cout << "載入dll失敗" << endl;
}
else
{
SAYHELLO * lpproc =(SAYHELLO *)GetProcAddress(hDllInst,"SayHello");
if(NULL != lpproc)
(*lpproc)();
FreeLibrary(hDllInst);
}
system("pause");
return 0;
}
按F7編譯。再按F5運行。結果如下。
二、使用def檔案聲明匯出函數
def檔案又叫做模組定義檔案,這是一個用於描述DLL屬性的文字檔,每個def檔案一般要包括以下模組定義語句:
A) LIBRARY語句,指出DLL的名字,連結器將把這個名字放到DLL庫中。
B) EXPORTS語句,列出庫中匯出函數的名稱及匯出函數的序號(可選)。
C) DISCRIPION語句,該語句用來描述DLL的用途等說明。
可以在def檔案分號“;”後面書寫備註陳述式。
在建立DLL時,編譯連結器將要使用def檔案建立兩個檔案:一個匯出檔案(.EXP)和一個匯入庫檔案(.LIB),然後使用匯出檔案再建立DLL檔案。
外部應用程式使用的檔案是匯入庫檔案和DLL檔案。由於在匯入庫檔案中存放了外部應用程式可匯入的DLL匯出函數名稱列表,因此外部應用程式需要把它串連在應用程式中,才能以它為索引到DLL中去找到要調用的匯出函數。也就是說,匯入庫檔案相當於是DLL可提供的服務項目表。
例子:(用vs2008寫的例子)
方法同上面一樣建立一個DLL工程。
在檔案2_DLLDemo.cpp編寫代碼如下:
void SayHello()
{
::MessageBoxW(NULL, L"2_DLLDemo::Hello", L"fangyukuan", MB_OK);
}
然後再建立一個def檔案。
在工程右鍵->add->New Item…
在def檔案編寫如下代碼:
LIBRARY "2_DLLDemo"
EXPORTS
SayHello
按F7編譯完成。
測試方法同上面例子一樣。
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761464.html