Windows下使用Dev C++ 編寫dll與使用dll(二)C++項目下的dll


使用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復制到其文件夾下進行查看。

具體如何使用,就需要參考其他文章了。


免責聲明!

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



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