利用vs2010制作C語言 dll文件,並在其它程序中調用該dll文件


一、為什么需要dll

代碼復用是提高軟件開發 效率的重要途徑。一般而言,只要某部分代碼具有通用性,就可將它構造成相對獨立的功能模塊並在之后的項目中重復使用。比較常見的例子是各種應用程序框架, 如ATL、MFC等,它們都以源代碼的形式發布。由於這種復用是“源碼級別”的,源代碼完全暴露給了程序員,因而稱之為“白盒復用”。“白盒復用”的缺點 比較多,總結起來有4點。

  1. 暴露了源代碼;
  2. 容易與程序員的“普通”代碼發生命名沖突;
  3. 多份拷貝,造成存儲浪費;
  4. 更新功能模塊比較困難。

實際上,以上4點概括起來就是“暴露的源代碼”造成“代碼嚴重耦合”。為了彌補這些不足,就提出了“二進制級別”的代碼復用。使用二進制級別的代碼復用一定程度上隱藏了源代碼,對於緩解代碼耦合現象起到了一定的作用。這樣的復用被稱為“黑盒復用”。

在Windows操作系 統中有兩種可執行文件,其后綴名分別為.exe和.dll。它們的區別在於,.exe文件可被獨立的裝載於內存中運行;.dll文件卻不能,它只能被其它 進程調用。然而無論什么格式,它們都是二進制文件。上面說到的“二進制級別”的代碼復用,可以使用.dll來實現。

與白盒復用相 比,.dll很大程度上彌補了上述4大缺陷。.dll是二進制文件,因此隱藏了源代碼;如果采用“顯式調用”(后邊將會提到),一般不會發生命名沖突;由 於.dll是動態鏈接到應用程序中去的,它並不會在鏈接生成程序時被原原本本拷貝進去;.dll文件相對獨立的存在,因此更新功能模塊是可行的。

說明:實現“黑盒復用”的途徑不只dll一種,靜態鏈接庫甚至更高級的COM組件都是。本文只對dll進行討論。

二、C語言制作dll文件

1. 啟動vs2010, 

2.創建dll工程

  a. 文件 -> 新建 ->  項目 -> win32控制台應用程序 —> 

  b. 輸入工程名稱, 比如 dll, 點擊確定

  c. 點擊下一步, 在“應用程序設置界面” 勾選 dll 和空項目, 點擊完成按鈕

  d. 視圖 -> 解決方案資源管理器 ->右鍵點擊頭文件, 添加->新建項,這里用dll.h,

  e. 右鍵點擊"源文件",添加->新建項,這里我們添加dll.c,到此dll工程搭建完畢. 

3. dll.h

#ifndef AXLPLUGIN_H  
#define AXLPLUGIN_H  
/**/  
#ifdef _WINDOWS  
#define DLL_DECLARE __declspec(dllexport)  
#else  
#define DLL_DECLARE  
#endif  
DLL_DECLARE int Min(int a, int b);  
/* 把所有的函數聲明都列在這里 */  
#endif  

4. dll.c

#include "dll.h"  
#include <stdio.h>  
/*根據需要添加相應的頭文件*/  
DLL_DECLARE int Min(int a, int b)  
{  
    if (a >= b)   
        return b;  
    else   
        return a;  
}  
/* 把所有聲明的函數都在這里實現*/  

5. 生成dll lib 文件

點擊build -> build dll

這樣,dll 和 lib 文件就生成了。

5. dll文件的使用

試驗證明dll.dll文件要和dll.lib以及dll.h文件一起使用  

三 ,在程序中加載dll

  1. 新建一個測試用的"Win32應用程序"  
  2. 操作:

    a.文件->新建->項目->Win32控制台應用程序.

    b.輸入工程名稱,這里我們用test_dll,點擊確定按鈕.  

       c.點擊下一步,在"應用程序設置界面設置"控制台應用程序"和"空項目",點擊完成按鈕.  

       d.將工程dll目錄里的dll.h/dll.dll/dll.lib拷貝到工程test_dll目錄里。  

       e.視圖->解決方案資源管理器,右鍵點擊"頭文件",添加->新建項,這里咱們用dll.h  

         右鍵點擊"源文件",添加->新建項,這里我們添加test_dll.c,右鍵點擊“資源文件”,  

         添加->"現有項",選擇dll.lib,到此test_dll工程搭建完畢.   

  3.  編輯test_dll.c文件,內容如下 

#include "dll.h"  
#include <stdio.h>  
int main()  
{  
    printf("Min(2, 4) = %d\n", Min(2, 4));  
    printf("Min(5, 2) = %d\n", Min(5, 2));  
    return 0;  
}  

四,dll和test_dll工程的目錄結構  

../test_dll/  
│  test_dll.sdf  
│  test_dll.sln  
│  test_dll_dir.txt  
├─Debug  
│      test_dll.exe  
│      test_dll.ilk  
│      test_dll.pdb        
├─ipch  
│  └─test_dll-eb5063a1  
│          test_dll-c06c53e7.ipch           
└─test_dll  
    │  dll.dll  
    │  dll.h  
    │  dll.lib  
    │  test_dll.c  
    │  test_dll.vcxproj  
    │  test_dll.vcxproj.filters  
    │  test_dll.vcxproj.user   
    └─Debug  
            cl.command.1.tlog  
            CL.read.1.tlog  
            CL.write.1.tlog  
            link-cvtres.read.1.tlog  
            link-cvtres.write.1.tlog  
            link.3004-cvtres.read.1.tlog  
            link.3004-cvtres.write.1.tlog  
            link.3004.read.1.tlog  
            link.3004.write.1.tlog  
            link.command.1.tlog  
            link.read.1.tlog  
            link.write.1.tlog  
            mt.command.1.tlog  
            mt.read.1.tlog  
            mt.write.1.tlog  
            rc.command.1.tlog  
            rc.read.1.tlog  
            rc.write.1.tlog  
            test_dll.Build.CppClean.log  
            test_dll.exe.embed.manifest  
            test_dll.exe.embed.manifest.res  
            test_dll.exe.intermediate.manifest  
            test_dll.lastbuildstate  
            test_dll.log  
            test_dll.obj  
            test_dll_manifest.rc  
            vc100.idb  
            vc100.pdb

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM