1. 程式人生 > >用VS製作簡單dll的過程 C和c++版本

用VS製作簡單dll的過程 C和c++版本

建立dll的過程其實並不難,但是MDN上明確表示對於C++製作的dll支援的不好,因此要使用的dll必須是C語言規範的,於是我就打算用VC6.0來做這個dll。做了整整一下午,不斷的查閱資料,終於還是沒能做出來。後來我改用VS2010來試了一下,發現成功了。編寫最簡單的dll過程如下:
首先用VS2010新建一個win32專案,然後選擇dll、空專案。
在建立的空專案裡面新增三個檔案:lib.h、lib.c和lib.def。然後build一下就可以在debug目錄下生成一個dll檔案和一個lib檔案

也可以在空專案中新增這三個檔案:lib.h、lib.cpp和lib.def。同樣build一下就可以得到一個dll檔案和一個lib檔案,這是C++方式,前面一種是C的方式
這個dll實現了一個add函式。下面貼出上述六個檔案的程式碼。

C的方式

lib.h檔案的內容如下:
#ifndef LIB_H
#define LIB_H
int __declspec(dllexport)add(int x, int y);
#endif 
lib.c檔案的內容如下:
#include "lib.h"
int add(int x, int y)
{
return x + y;
}
lib.def的內容如下:
LIBRARY dTest
EXPORTS
add @ 1 
要測試生成的這個dll,可以新建一個空的控制檯應用程式,然後其main.c如下(注意這是C方式,因此main.c而不是main.cpp):另外,採用這種靜態呼叫的方式需要將生成的dll檔案和lib檔案複製到main.c相同目錄下。

#include <stdio.h>
#pragma comment(lib,"dTest.lib")
int __declspec(dllimport) add(int x,int y);
void main()
{
int a=add(2,6);
printf("%d\n",a);
} 

C++的方式

所對應的三個檔案及測試函式,首先是lib.h,內容如下:
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif
注意與C方式的區別,這裡有extern "C"

lib.cpp檔案內容如下:

#include "lib.h"
int add(int x, int y)
{
return x + y;
}
.c檔案和.cpp檔案是函式的具體實現,與dll的建立過程沒什麼關係。 

lib.def檔案內容:

LIBRARY dllTest
EXPORTS
add @ 1
與C方式的沒有什麼區別 
C與C++方式的不同在於函式宣告處,不管是標頭檔案還是實現檔案,只要是在宣告函式,這兩種方式就不一樣。
下面是c++方式的測試程式碼,同樣也是新建一個控制檯應用程式空專案,main.cpp檔案內容為:
#include <stdio.h>
#pragma comment(lib,"dllTest.lib")
extern "C" int __declspec(dllimport) add(int x,int y);
void main()
{
int a=add(2,6);
printf("%d\n",a);
}
與C方式的不同也就在於有沒有extern "C" 。

總結一下在做dll的過程中最重要的是要搞清楚誰對應誰,只要是在c++裡面呼叫到C的函式就必須加上extern "C" 雖然沒有嘗試過用C++來測試C的dll,但想必也是這樣,有興趣的可以一試。

dll其實有很多型別的,我只是去研究了最簡單的dll的實現方式,其他型別的dll我遇到的都忽略了,下面給出幾個我在查詢資料過程中遇到的感覺比較好的資料,想研究dll的可以去參考參考。

參考資料

http://wenwen.soso.com/z/q118568910.htm
http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html
http://ks.pconline.com.cn/?q=VC%2B%2B%B6%AF%CC%AC%C1%B4%BD%D3%BF%E2%28DLL%29%B1%E0%B3%CC%C9%EE%C8%EB%C7%B3%B3%F6&Submit3=%BF%EC%CB%D1
2
引用“mzlogin”的評論:使用def檔案就可以不用__declspec(export)和__declspec(import)的...

是的,呵呵。當時都給整起了。。 2012-03-10 20:11回覆

使用def檔案就可以不用__declspec(export)和__declspec(import)的喲~呵呵