Visual Studio 創建和使用dll的方法


DLL是一個包含可由多個程序同時使用的代碼和數據的庫。

DLL文件就是把一些函數導出來,然后在新程序中進行復用的過程。

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

生成方法一:

第一步:選擇創建win32應用程序

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

第三步:在頭文件添加Demoone.h

代碼如下:

1 #ifndef _Demo_H_
2 #define _Demo_H_
3 #ifdef LIBDLL
4     #define LIBDLL extern "C" _declspec(dllimport)
5 #else
6     #define LIBDLL extern "C" _declspec(dllexport)
7 #endif
8 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"
EXPORTS
Add @ 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"//方法a
using namespace std;
#pragma comment(lib, "DLLDemoone.lib")
//extern "C" _declspec(dllimport) int Add(int a, int b);//方法b
int 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


免責聲明!

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



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