用VS製作簡單dll的過程

今天嘗試了一把做dll。之所以去做dll是因爲之前發現firefox從gecko2.0開始支持JS-Ctypes,利用js-Ctypes可以直接使用javascript腳本調用dll二進制文件,與firefox進行交互。這極大的方便了製作插件及創建基於gecko的應用程序。下面我描述一下今天製作dll的過程,和一些感受。
創建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
http://blog.csdn.net/btwsmile/article/details/6676802

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章