使用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復制到其文件夾下進行查看。
具體如何使用,就需要參考其他文章了。
