C++ dll的隱式與顯式調用



轉載自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html


  應用程序使用DLL可以采用兩種方式:一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數的結構信息。Visual C++6.0(或者更先進的版本)在VC\bin目錄下提供了一個名為Dumpbin.exe的小程序(使用方法見VS自帶工具:dumpbin的使用),用它可以查看DLL文件中的函數結構。另外,Windows系統將遵循下面的搜索順序來定位DLL: 1.包含EXE文件的目錄,2.進程的當前工作目錄, 3.Windows系統目錄, 4.Windows目錄,5.列在Path環境變量中的一系列目錄。

  1.隱式鏈接

  隱式鏈接就是在程序開始執行時就將DLL文件加載到應用程序當中。實現隱式鏈接很容易,只要將導入函數關鍵字_declspec(dllimport)函數名等寫到應用程序相應的頭文件中就可以了。下面的例子通過隱式鏈接調用MyDll.dll庫中的Min函數。首先生成一個項目為TestDll,在DllTest.h、DllTest.cpp文件中分別輸入如下代碼:

//Dlltest.h#include"MyDll.h"
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#include"Dlltest.h"
void main()
{int a;
a=min(8,10)
printf("比較的結果為%d\n",a);
}


  在創建DllTest.exe文件之前,要先將MyDll.dll和MyDll.lib拷貝到當前工程所在的目錄下面,也可以拷貝到windows的System目錄下。如果DLL使用的是def文件,要刪除TestDll.h文件中關鍵字extern "C"。TestDll.h文件中的關鍵字Progam commit是要Visual C+的編譯器在link時,鏈接到MyDll.lib文件,當然,開發人員也可以不使用#pragma comment(lib,"MyDll.lib")語句,而直接在工程的Setting->Link頁的Object/Moduls欄填入MyDll.lib既可。

  2.顯式鏈接

  顯式鏈接是應用程序在執行過程中隨時可以加載DLL文件,也可以隨時卸載DLL文件,這是隱式鏈接所無法作到的,所以顯式鏈接具有更好的靈活性,對于解釋性語言更為合適。不過實現顯式鏈接要麻煩一些。在應用程序中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態鏈接庫調進來,動態鏈接庫的文件名即是上述兩個函數的參數,此后再用GetProcAddress()獲取想要引入的函數。自此,你就可以象使用如同在應用程序自定義的函數一樣來調用此引入函數了。在應用程序退出之前,應該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動態鏈接庫。下面是通過顯式鏈接調用DLL中的Max函數的例子。

#include <windows.h>
#include <cstdio>
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加載動態鏈接庫MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比較的結果為%d\n",a);
FreeLibrary(hDLL);//卸載MyDll.dll文件;
}

  在上例中使用類型定義關鍵字typedef,定義指向和DLL中相同的函數原型指針,然后通過LoadLibray()將DLL加載到當前的應用程序中并返回當前DLL文件的句柄,然后通過GetProcAddress()函數獲取導入到應用程序中的函數指針,函數調用完畢后,使用FreeLibrary()卸載DLL文件。在編譯程序之前,首先要將DLL文件拷貝到工程所在的目錄或Windows系統目錄下。

  使用顯式鏈接應用程序編譯時不需要使用相應的Lib文件。另外,使用GetProcAddress()函數時,可以利用MAKEINTRESOURCE()函數直接使用DLL中函數出現的順序號,如將GetProcAddress(hDLL,"Min")改為GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函數Min()在DLL中的順序號是2),這樣調用DLL中的函數速度很快,但是要記住函數的使用序號,否則會發生錯誤。

注意兩點:

1.上面中提到extern "C",表明函數使用c語言的風格編譯函數,這樣后面顯式調用時,GetProcAddress第二個參數就是原來的函數名,否則如果使用C++編譯的話支持函數重載,則第二個參數會發生變化,想要知道發生了什么變化,可以使用前面提到的Dumpbin工具查看dll的生成函數。具體參考文章:http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html

2.MAKEINTRESOURCE()函數可以代替復制dll生成的函數的一大串字符串名,但是必須知道函數生成的順序,所以你也必須打開dll查看,才能知道。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《OpenGL ES 2.0游戲開發(上卷):基礎技術和典型案例》——6.5節光照的每頂點計算與每片元計算...

本節書摘來自異步社區《OpenGL ES 2.0游戲開發&#xff08;上卷&#xff09;&#xff1a;基礎技術和典型案例》一書中的第6章&#xff0c;第6.5節光照的每頂點計算與每片元計算&#xff0c;作者 吳亞峰&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 6.5 光照…

毛筆筆鋒算法IOS版

http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/#.VUln2_mqpBe轉載于:https://www.cnblogs.com/wangjinming/p/4481145.html

USE PDFCREATE TO CREATE A PDF FILE

來源&#xff1a;http://www.pdfforge.org/files/old_forum/1002.html a working sample with C & COM 2007-08-15 22:56:18 by eckart hi, here is a working sample of how to use PDFCreator in Visual C (after searching on internet for something similar I guess t…

python將一行作為字段_關于python:Django admin在同一行顯示多個字段

我已經創建了一個模型&#xff0c;它將自動顯示模型中的所有字段&#xff0c;并將其顯示在管理頁面上。 現在&#xff0c;我有一個問題&#xff0c;我希望在同一行中有兩個字段&#xff0c;為此&#xff0c;我必須在modeladmin中指定字段集&#xff1a; 1 2 3 4 5fieldsets ( …

c++顯式加載dll并使用DLL的類

轉載自&#xff1a; &#xfeff;&#xfeff;http://blog.163.com/tianjunqiang666126/blog/static/8725911920121064573594/ 首先需要強調&#xff0c;當使用某個類時一般目的有二&#xff1a;實例化成對象或者繼承它產生新類。對于前者&#xff0c;我們可以構造一個抽象類&a…

如何在Debian上安裝配置ownCloud

如何在Debian上安裝配置ownCloud 據其官方網站&#xff0c;ownCloud可以讓你通過一個Web界面或者WebDAV訪問你的文件。它還提供了一個平臺&#xff0c;可以輕松地查看、編輯和同步您所有設備的通訊錄、日歷和書簽。盡管ownCloud與廣泛使用Dropbox非常相似&#xff0c;但主要區別…

jQuery相當于對 javascript二次開發,所以基于 jQuery實現的各種插件直接調用即可...

jQuery相當于對 javascript二次開發&#xff0c;所以基于 jQuery實現的各種插件直接調用即可轉載于:https://www.cnblogs.com/npk19195global/p/4482363.html

[轉]js判斷url是否有效

本文轉自&#xff1a;http://www.cnblogs.com/fumj/p/3490121.html 方法一:(僅適用于ie) function CheckStatus(url){XMLHTTP new ActiveXObject("Microsoft.XMLHTTP")XMLHTTP.open("HEAD",url,false)XMLHTTP.send()return XMLHTTP.status200}function Ne…

VS中lib和dll

轉載&#xff1a; &#xfeff;&#xfeff;http://www.cnblogs.com/Yogurshine/archive/2013/06/14/3136025.html Lib文件 先來說一說lib文件&#xff0c;C中lib文件主要有兩類&#xff0c;一種是靜態的編譯連接&#xff0c;叫做靜態鏈接庫&#xff0c;另一種是動態的編譯鏈…

32位md5解密_冰蝎特征檢測及報文解密

點擊“藍字”關注我們&#xff0c;不迷路~??前言19年駐場于某金融單位。參加19年9月、11月兩次攻防演練&#xff0c;負責攻防演練組織、技術支持和復盤。期間&#xff0c;多個攻擊隊伍使用冰蝎 webshell &#xff0c;防守方監測時確實各 IDS 確實報出 webshell 連接&#xff…

使用extern C改善顯式調用dll

extern "C"的簡單解析 我們前面介紹了顯式調用dll的方法&#xff0c;例如 &#xfeff;&#xfeff;http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html &#xff0c;其中在GetProcAddress第二個參數的填寫煞費苦心&#xff0c;我們需要比較麻煩…

《移動App測試的22條軍規》—App測試綜合案例分析23.13節測試微信App的流量和電量消耗...

本節書摘來自異步社區《移動App測試的22條軍規》一書中的App測試綜合案例分析&#xff0c;第23.13節測試微信App的流量和電量消耗&#xff0c;作者黃勇&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 23.13 測試微信App的流量和電量消耗關于微信App消耗流…

UVA 10269 Super Mario,最短路+動態規劃

這個題目我昨晚看到的&#xff0c;沒什么思路&#xff0c;因為馬里奧有boot加速器&#xff0c;只要中間沒有城堡&#xff0c;即可不耗時間和腳力&#xff0c;瞬間移動不超過L距離&#xff0c;遇見城堡就要停下來&#xff0c;當然不能該使用超過K次。。。我糾結了很久&#xff0…

python做數據可視化的代碼_Python數據可視化正態分布簡單分析及實現代碼

Python說來簡單也簡單&#xff0c;但是也不簡單&#xff0c;尤其是再跟高數結合起來的時候。。。 正態分布&#xff08;Normaldistribution&#xff09;&#xff0c;也稱“常態分布”&#xff0c;又名高斯分布&#xff08;Gaussiandistribution&#xff09;&#xff0c;最早由A…

ACdream 1061(abs用法)

題目鏈接&#xff1a;http://acdream.info/problem?pid1061 主要是abs用法&#xff0c;看題目的數據 long long的最大值&#xff1a;9223372036854775807 long long的最小值&#xff1a;-9223372036854775808 unsigned long long的最大值&#xff1a;18446744073709551615 由題…

wpf window 不執行show 就不能load執行_Numpy反序列化命令執行漏洞分析(CVE-2019-6446)附0day...

1、介紹 NumPy 是 Python 機器學習庫中之一&#xff0c;主要對于多為數組執行計算。NumPy 提供大量的 函數和操作&#xff0c;能夠幫助程序員便利進行數值計算。在 NumPy 1.16.0 版本之前存在反序列化 命令執行漏洞&#xff0c;用戶加載惡意的數據源造成命令執行。2、環境 軟件…

使用Def文件導出dll

前面我們介紹了dll的生成&#xff0c;大多數是使用extern "C"__declspec(dllexport)函數名的方法導出dll。其實我們還有另一種方法來導出dll。 先介紹參考文獻&#xff1a; 1.dll導出聲明相關 2.VS2012中 C創建DLL圖解 3.DLL中導出函數的兩種方式(dllexport與.…

HDU 1003 Maxsum

題目大意&#xff1a;求出數列的最大子段和&#xff0c;并且說明是從第幾項至第幾項。 題解1&#xff1a;簡單貪心。 #include <cstdio> #define rep(i,n) for(int i1;i<n;i) int main(){int t,l0;scanf("%d",&t);while(t--&&l){if(l!1)printf…

《JavaScript面向對象精要》——1.8 原始封裝類型

本節書摘來自異步社區《JavaScript面向對象精要》一書中的第1章&#xff0c;第1.8節&#xff0c;作者&#xff1a;【美】Nicholas C. Zakas著&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.8 原始封裝類型 JavaScript中一個最讓人困惑的部分可能就是原始…

XML語法學習

本文章集合兩篇博文而寫&#xff0c;兩篇博文地址&#xff1a; XML學習總結(二)——XML入門&#xff1a; XML基礎<第一篇> XML簡介 XML是一種標記語言&#xff0c;用于描述數據&#xff0c;它提供一種標準化的方式來來表示文本數據。XML文檔以.xml為后綴。需要徹底注…