動態連結程式庫的建立

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.