使用Dev c++,新建一個c++項目的dll項目。
還是會自動生成兩個文件,只是這里不是.c文件,而是.cpp了。
這里,為了測試,我們分別在cpp與h文件中像之前C項目一樣,添加一個HelloWorld函數,與一個add函數。
其他的,我們先啥也不管。直接編譯運行。
代碼如下:
/* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> DllClass::DllClass() { } DllClass::~DllClass() { } void DllClass::HelloWorld() { MessageBox(0, "Hello World from DLL!\n","Hi",MB_ICONINFORMATION); } DLLIMPORT void HelloWorld() { MessageBox(0, "Hello World from DLL!\n","Hi",MB_ICONINFORMATION); } DLLIMPORT int add(int a,int b) { return a+b; } BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: { break; } case DLL_PROCESS_DETACH: { break; } case DLL_THREAD_ATTACH: { break; } case DLL_THREAD_DETACH: { break; } } /* Return TRUE on success, FALSE on failure */ return TRUE; }
#ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL #define DLLIMPORT __declspec(dllexport) #else #define DLLIMPORT __declspec(dllimport) #endif class DLLIMPORT DllClass { public: DllClass(); virtual ~DllClass(); void HelloWorld(); }; DLLIMPORT void HelloWorld(); DLLIMPORT int add(int,int); #endif
編譯運行,打開文件夾,查看。
生成了dll_demo.dll。我們還是像之前一樣,使用test.cpp來引入這個dll中的函數。
dll調用成功,但是居然沒有彈出一個MessageBox。哪里有問題呢?
再來看看add函數。
仍然是調用成功,運行卡頓,而且返回非0數值,也卻無法調用add函數,這是為什么呢。
依照本人粗淺的理解:大體就是c++項目生成的dll,會重新給函數、類命名。
具體可以看剛才文件夾下的.def文件。我們打開看看。(以打開文本方式打開即可,這里安利一款非常好用的空格預覽工具QuickLook,選擇文件,按下空格,即可預覽)
這是這個dll的導出表,很明顯,並沒有單獨的add。
實際上,之前C項目生成dll文件也是有這個文件的,大家可以自行對比,只是C項目生成dll不會導致函數重命名,就不做詳敘。
這里可見,HelloWorld函數已經重命名為“_Z10HelloWorldv”。我們還是在test.cpp中試試。
點擊確定,程序便返回正常的0了。
那么,如何才能不讓函數名發生變化呢?如下:
我們同時改動這兩個文件,cpp文件,隨便刪除分號,再填上就好,.h文件如下:
重新編譯運行生成dll。
再次查看def文件。
類且不管,我們需要用到的HelloWorld與add函數都恢復了,在test1.cpp中測試一下。
ok的,可以正常使用。
要查看dll中的函數方法,可以使用dumpbin.exe,這個是什么,需要自行摸索,這里僅提及一下。
以及使用步驟:
打開dumpbin.exe文件夾,進入cmd命令行。dumpbin /exports C:\hello.dll。即可查看。
顯然,后面是一個絕對路徑,因為沒有必要把一個dll復制到其文件夾下進行查看。
具體如何使用,就需要參考其他文章了。