注意:32DLL或應用程序轉成64為的不能只是把界面中選一下,尤其是多項目的解決方案,要在屬性中添加X64后在編譯
一、生成dll
方法一、使用__declspec(dllexport) 見例子如下在頭文件中:
函數:int __declspec(dllexport) ?int Add(int a,int b);
類:class __declspec(dllexport) COleFont : public COleDispatchDriver //類直接導出
方法二、使用def文件導出
函數例子如下:
LIBRARY
EXPORTS
; 此處可以是顯式導出
Add @1
Sub @2 ?//@2不加也可以
c++類:鏈接http://www.bubuko.com/infodetail-486525.html和http://blog.163.com/hbu_lijian/blog/static/1261291532013031101546987/
都說“如果你的DLL里全是C++的類的話,你無法在DEF里指定導出的函數,只能用__declspec(dllexport)導出類”
但在鏈接“http://blog.sina.com.cn/s/blog_81c6474c01015x1a.html”中是說明如何做的,我在vs2012中招做了,但是生成映射文件中沒有構造函數和析構函數的map文件,只有成員函數。只在def文件中添加成員函數的導出,調用dll的例子提示找不到構造和析構函數,提示map的位置和鏈接上的一樣,單我把復制到def文件中,dll工程就編譯不過了。
我現在也不知道“def”的方式可不可以把類及其成員函數導出?如有大神知道可以密我聊哦。
def文件添加方式如下圖:
二、調用dll
1、生命本例庫工程和調用庫工程的工程在一個解決方案中。
首先要有一個lib、dll和.h
2、添加.h,右鍵工程添加現有項,添加lujing
添加$(SolutionDir)\dlltest,也可以是絕對路徑,但這樣解決方案移動后就編譯不過
3、添加lib
在紅色區域添加lib庫,然后田間lib庫所在的位置
把lib所在的路徑加入$(SolutionDir)\Debug,可以是絕對路徑,但這樣不能移動工程
4、把dll復制到生的exe所在的路徑,或配置屬性->調試->環境:輸入path=包含dll文件的文件夾路徑
這樣的好處是可以調試庫函數。
方法2:
#pragma comment (lib,"*.lib")
加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈接不同版本的LIB文件。因為,在Debug方式下,產生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產生的LIB文件是Release版本,如Regr.lib。然后在首先要使用該函數的地方加上該LIB的頭文件,如#include "..\lib.h"即可(沒有頭文件當然就不用了)。
方法3:顯式的調用鏈接庫
隱式鏈接雖然實現較簡單,但除了必須的*.dll文件外還需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的場合就無法使用,而只能采用顯式鏈接的方式。這種方式通過調用API函數來完成對DLL的加載與卸載,能更加有效地使用內存,在編寫大型應用程序時往往采用此方式。這種方法編程具體實現步驟如下:
①使用Windows API函數Load Library或者MFC提供的AfxLoadLibrary將DLL模塊映像到進程的內存空間,對DLL模塊進行動態加載。
②使用GetProcAddress函數得到要調用DLL中的函數的指針。
③不用DLL時,用Free Library函數或者AfxFreeLibrary函數從進程的地址空間顯式卸載DLL。
方法3:參考https://zhidao.baidu.com/question/1177981710216857219.html
————————————————
版權聲明:本文為CSDN博主「woquNOKIA」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/woquNOKIA/article/details/51820033