Visual Studio 建立和使用dll的方法

來源:互聯網
上載者:User

標籤:

DLL是一個包含可由多個程式同時使用的代碼和資料的庫。

DLL檔案就是把一些函數匯出來,然後在新程式中進行複用的過程。

第一部分:使用Visual Studio 2010進行DLL的製作

產生方法一:

第一步:選擇建立win32應用程式

第二步:在彈出的應用程式嚮導中做出如下選擇:

第三步:在標頭檔添加Demoone.h

代碼如下:

1 #ifndef _Demo_H_2 #define _Demo_H_3 #ifdef LIBDLL4     #define LIBDLL extern "C" _declspec(dllimport)5 #else6     #define LIBDLL extern "C" _declspec(dllexport)7 #endif8 LIBDLL int Add(int plus1, int plus2);9 #endif

添加Demoone.cpp

代碼如下:

#include "Demoone.h"int Add ( int a , int b ){    return ( a + b );}

結構視圖如下:

然後點擊“產生”下的“產生解決方案”即可

在項目目錄下/debug/目錄下存在DllDemoone.lib和DllDemoone.dll

產生方法二:

該方法不需要使用_declspec(dllimport)的方式,一二步與上同。

第三步:

Demotwo.h代碼如下:

#ifndef _Demo_H_#define _Demo_H_extern "C" int Add (int a , int b);#endif

Demotwo.cpp和上一步驟相同

第四步:

添加def檔案:在“添加建立項”中左側選擇“代碼”,建立一個模組定義檔案,名字隨意。它用來建立LIB檔案內容如下:

LIBRARY "Dllmaketwo"EXPORTSAdd @ 1 

最終視圖如下:

產生解決方案也能得到dll檔案。

第二部分:使用dll檔案

當我們的程式需要使用DLL時,就需要去載入DLL,在程式中載入DLL有兩種方法,分別為載入時動態連結運行時動態連結
在載入時動態連結中,應用程式像調用本地函數一樣對匯出的DLL函數進行顯示調用。要使用載入時動態連結,需要在編譯和連結應用程式時提供標頭檔和匯入庫檔案(.lib)。當這樣做的時候,連結器將向系統提供載入DLL所需的資訊,並在載入時解析匯出的DLL函數的位置;
在運行時動態連結中,應用程式調用LoadLibrary函數或LoadLibraryEx函數以在運行時載入DLL。成功載入DLL後,可以使用GetProcAddress函數獲得要調用的匯出的DLL函數的地址。在使用運行時動態連結時,不需要使用匯入庫檔案(lib)。
在實際編程時有兩種使用DLL的方法,那麼到底應該使用那一種呢?在實際開發時,是基於以下幾點進行考慮的:
1、啟動效能 如果應用程式的初始啟動效能很重要,則應使用運行時動態連結;
2、易用性 在載入時動態連結中,匯出的DLL函數類似於本地函數,我們可以方便地進行這些函數的調用;
3、應用程式邏輯在運行時動態連結中,應用程式可以分支,以便按照需要載入不同的模組。

方法一:載入時動態連結

建立一個普通控制台項目,將DLLDemoone.lib,DLLDemoone.dll以及Demoone.h複製到和項目代碼相同的路徑下:

代碼按如下方式書寫:

#include <iostream>#include"Demoone.h"//方法ausing namespace std;#pragma comment(lib, "DLLDemoone.lib")//extern "C" _declspec(dllimport) int Add(int a, int b);//方法bint main(int argc, char *argv[]){      cout<<Add(2, 3)<<endl;      return 0;}

運行即可獲得正確的結果。

方法a和方法b是兩種不同方式,若使用方法b則不需要拷貝Demo.h這個標頭檔。

方法二:運行時動態連結

建立一個普通控制台項目,將DLLDemoone.lib,DLLDemoone.dll以及Demoone.h複製到和項目代碼相同的路徑下:

#include <windows.h>#include <iostream>using namespace std;typedef int (*AddFunc)(int a, int b);int main(int argc, char *argv[]){      HMODULE hDll = LoadLibrary("DLLmaketwo.dll");      if (hDll != NULL)      {            AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE(1));            if (add != NULL)            {                  cout<<add(2, 3)<<endl;            }            FreeLibrary(hDll);      }}

在這裡會碰到error C2664: “LoadLibraryW”: 不能將參數 1 從“const char *”轉換為“LPCWSTR”的問題,解決方式是將工程的字元方式進行修改即可,具體見另一篇:

http://www.cnblogs.com/holyprince/p/4236586.html

建立和使用方法大致分為以上四種,參考了兩篇文章,多謝他們:

http://www.jellythink.com/archives/111

http://www.aichengxu.com/view/14438

Visual Studio 建立和使用dll的方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.