1. 程式人生 > >在VS2017環境下動手寫你的第一個DLL(轉載)

在VS2017環境下動手寫你的第一個DLL(轉載)

在VS2017環境下,開始寫自己的第一個DLL(動態連結庫),(本人小白,如果文章中有什麼錯誤,還請各位指點)

 

  首先介紹一下什麼是動態連結庫,我們平常在安裝遊戲,安裝軟體的時候,有的時候就會提示你,無法開啟。。。由於缺失。。。.dll檔案,請重新安裝。這就是由於安裝過程中丟失了某種dll檔案產生的,在百度百科上是這麼解釋的

       DLL(Dynamic Link Library)檔案為動態連結庫檔案,又稱“應用程式拓展”,是軟體檔案型別。在Windows中,許多應用程式並不是一個完整的可執行檔案,它們被分割成一些相對獨立的

動態連結庫,即DLL檔案,放置於系統中。當我們執行某一個程式時,相應的DLL檔案就會被呼叫。一個應用程式可使用多個DLL檔案,一個DLL檔案也可能被不同的應用程式使用,這樣的DLL檔案被稱為共享DLL檔案。

      不管它是啥,它名字裡有一個庫字,它就能被人呼叫,就跟c++的標頭檔案似的,但是前面有一個動態連結,其實就是在生成的可執行檔案想要執行的時候,必需要有相應dll來輔助,那麼為什麼要這麼做呢

     最開始本人很好奇,用sublime打開了電腦裡隨便的一個dll,以為能看到一串串的c++程式碼,但是開啟之後,結果是這樣的

 

 

 

 

 

這誰能看懂啊,,,所以,本人認為,首先,這種東西封裝性好,別人誰也看不懂,只有自己內部人員能用,那封裝的一定啊,

百度上解釋dll檔案的作用是 通過DLL檔案,程式可以實現模組化,這個不難理解,就是特定功能分類放在一塊。第二個是,可以更為容易地將更新應用與各個模組。看到這句話似乎又明白了,這個辦法好,咱們可以更新程式的時候更新DLL檔案啊,比如只想改程式中的幾個數,那我們最開始的時候就把這幾個未來想有改變的數放在dll檔案裡,到時候如果想改,那就重新生成一個dll檔案,替換掉原來那個,目的就實現了,這樣一想確實是很方便。

 

那麼我們現在就開始一步一步地進行,我想記錄的詳細一點,首先怕日後自己都不記得,同時也是留下一個紀念

 

一、開啟VS2017:

 

 

二、檔案->新建->專案

 

 

三、Visual C++->Windows桌面->動態連結庫DLL->起名字

 

 

四、右側 標頭檔案->新增->新建項

 

 

五、選擇標頭檔案,起名字

 

 

在這個標頭檔案裡面我們看到有一個#pragma once 這個東西是起到保證標頭檔案只被編譯一次的作用,很像之前用的#ifndef #define #endif 但是用這個確實短小精悍

 

 

六、先寫原始檔,寫一個輸出一個彩色的“加油,給我們自己“,函式起名叫show()

 

 
  1. #include "stdafx.h"

  2. #include "first.h"

  3. #include <Windows.h>

  4. #include <iostream>

  5. using namespace std;

  6. void show(void)

  7. {

  8. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);

  9. cout << " 加" ;

  10. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|FOREGROUND_GREEN);

  11. cout << "油";

  12. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN| FOREGROUND_BLUE);

  13. cout << ",";

  14. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE);

  15. cout << "給";

  16. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);

  17. cout << "自";

  18. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);

  19. cout << "己";

  20. }


 

 

七、再寫標頭檔案 用到__declspec(dllexport) 

 

 
  1. #pragma once

  2.  
  3. __declspec(dllexport) void show(void);

 

那麼這個__declspec()是非常重要的一個函式,裡面引數是dllexport,就是匯出,裡面引數是dllimport,就是匯入。

在要要輸出的函式前加上__declspec(dllexport),表示輸出。

 

八、生成解決方案(快捷鍵F6)

 

 

 

九、我們去專案資料夾裡,找到Debug,這裡面有我們剛剛生成的檔案

 

 

 

這兩個是關鍵的檔案

 

 

 

到此我們想要做的就已經實現了,生成了屬於咱們的dll ,這個lib是我們在寫程式中新增的檔案,dll是我們在生成程式之後要使用的檔案。

現在我們要用這個dll和lib來測試一下

 

十、新建一個控制檯應用程式

 

 

十一、把剛才的first.h和first.lib都複製到test的專案資料夾裡

 

把first.dll放到最外邊的那個Debug資料夾裡

 

 

 

其中,要在專案->屬性->C/C++->程式碼生成->執行庫->改成DLL(/MDd)

 

 

然後,在右側標頭檔案中新增first.h 資原始檔中新增first.lib

 

 

十二、在test.cpp中寫

 
  1. #include "stdafx.h"

  2. #include "first.h"

  3.  
  4. int main()

  5. {

  6. show();

  7. while (true)

  8. {

  9.  
  10. }

  11. return 0;

  12. }

 

十三、重新生成解決方案

 

去test中的Debug資料夾裡

 

開啟test.exe 

成功

 

 

 

如果說,我們想要把這個應用程式傳送給一個沒有安裝vs2017環境的電腦中執行,我們還要新增這些個dll

這是vs中自帶的,他們在C:\Windows\SysWOW64 路徑下

 

於是,我們如果要再想在別的程式中用這個庫,那我們要儲存三個東西,dll,lib ,.h