InvokeDllMethodsAdvance是一個(gè)國產(chǎn)的萬能動(dòng)態(tài)庫調(diào)用工具,不用編寫任何代碼,就可以調(diào)用符合WINAPI標(biāo)準(zhǔn)的任意動(dòng)態(tài)庫文件(WINAPI標(biāo)準(zhǔn)即__stdcall調(diào)用約定)。國產(chǎn)IDMA工具界面主要使用C#WinForm編寫,運(yùn)行依賴于.netframework4.0環(huán)境,底層采用C++封裝,用匯編實(shí)現(xiàn)對(duì)函數(shù)的動(dòng)態(tài)調(diào)用(函數(shù)參數(shù)的入棧及調(diào)用)
此工具非常適合上位機(jī)軟件開發(fā)或測(cè)試人員,可以省去編寫demo的時(shí)間,直接使用此工具進(jìn)行調(diào)試,有助于開發(fā)人員將更多的時(shí)間集中在功能開發(fā)上。
主要優(yōu)點(diǎn)如下:
不用編寫任何代碼,即可調(diào)用動(dòng)態(tài)鏈接庫。
適合入職新員工或不懂動(dòng)態(tài)鏈接庫調(diào)用的人使用。
可以免去測(cè)試demo的編寫,減輕開發(fā)人員工作量。
非常適合動(dòng)態(tài)鏈接庫的開發(fā)調(diào)試、測(cè)試等工作。
主要功能及使用
2.1主要步驟
1、選擇所要調(diào)用的動(dòng)態(tài)庫文件
2、選擇動(dòng)態(tài)庫配套的頭文件及函數(shù)
3、填寫完參數(shù)后,調(diào)用該函數(shù)
4、函數(shù)的出參或返回值會(huì)展示在對(duì)應(yīng)的位置
2.2選擇動(dòng)態(tài)庫
該操作完成對(duì)動(dòng)態(tài)庫的加載LoadLibrary
2.2.1選擇動(dòng)態(tài)庫方式一:通過瀏覽文件選擇
點(diǎn)擊按鈕可通過瀏覽的方式選擇所要調(diào)用的動(dòng)態(tài)庫。
2.2.2選擇動(dòng)態(tài)庫方式二:通過拖拽文件選擇
拖拽所要調(diào)用的動(dòng)態(tài)庫文件至動(dòng)態(tài)庫路徑文本框。
2.2.3選擇動(dòng)態(tài)庫方式三:同時(shí)拖拽動(dòng)態(tài)庫和頭文件
拖拽所要調(diào)用的動(dòng)態(tài)庫文件及頭文件,至參數(shù)列表表格DataGridView。
2.3選擇頭文件及函數(shù)
選擇頭文件的方式有三種,同上節(jié)中的動(dòng)態(tài)庫選擇,一種通過按鈕的方式,兩種通過拖拽的方式。
2.3.1獲取函數(shù)的方式一:選擇頭文件
通過選擇頭文件建立一個(gè)快速的函數(shù)切換列表,并自動(dòng)將選定的函數(shù)參數(shù)拆分,便于填寫和查看出入?yún)ⅰ?br/>選定一個(gè)函數(shù)后,工具會(huì)自動(dòng)將函數(shù)拆分出參數(shù)類型、參數(shù)名稱、參數(shù)數(shù)值、入?yún)?出參、數(shù)據(jù)格式,如果自動(dòng)分析出的入?yún)?出參類型、數(shù)據(jù)格式等不符合實(shí)際情況,需自行勾選更改。(參數(shù)數(shù)值、入?yún)?出參、數(shù)據(jù)格式是調(diào)用函數(shù)時(shí)最重要的三部分,只要這三部分設(shè)置正確,參數(shù)類型、參數(shù)名稱的對(duì)錯(cuò)不影響函數(shù)的調(diào)用,無需關(guān)心。關(guān)于數(shù)據(jù)格式的詳細(xì)說明請(qǐng)見附錄)
注:1、頭文件中的一個(gè)函數(shù)只能占一行,不符合需修改后再使用。
2、解析函數(shù)功能會(huì)自動(dòng)忽略以下開頭的行:/ # { } extern
2.3.2獲取函數(shù)的方式二:手動(dòng)填寫函數(shù)名及參數(shù)
也可以不選擇頭文件,手動(dòng)在中填寫需要調(diào)用函數(shù)名,并在參數(shù)列表中追加需要的參數(shù)。追加或插入的參數(shù)默認(rèn)為空行,參數(shù)數(shù)值、入?yún)?出參、數(shù)據(jù)格式是調(diào)用函數(shù)時(shí)最重要的三部分,只要這三部分填寫正確,參數(shù)類型、參數(shù)名稱可不填寫。關(guān)于數(shù)據(jù)格式的詳細(xì)說明請(qǐng)見附錄
2.3.3關(guān)于函數(shù)名及參數(shù)的調(diào)整
不管通過哪種方式獲取的函數(shù),都可以通過手動(dòng)修改的方式,對(duì)函數(shù)名及參數(shù)進(jìn)行調(diào)整。
通過右擊已添加參數(shù)的行首,或底部的按鈕,可對(duì)函數(shù)的參數(shù)個(gè)數(shù)進(jìn)行調(diào)整
2.4工具使用示例
在文件夾下存在一個(gè)測(cè)試用的動(dòng)態(tài)庫文件:,該動(dòng)態(tài)庫導(dǎo)出了一個(gè)名為add的函數(shù),函數(shù)的具體內(nèi)部實(shí)現(xiàn)如下:
extern"C"int__stdcalladd(intnum1,intnum2,int*multi)
{
*multi=num1*num2;
returnnum1+num2;
}
使用工具調(diào)用該動(dòng)態(tài)庫的示例如下:
1、選擇所要調(diào)用的動(dòng)態(tài)庫文件。點(diǎn)擊選擇動(dòng)態(tài)庫按鈕,通過文件瀏覽的方式選擇test.dll,選擇完成后在Path中會(huì)顯示dll文件的全路徑。如下圖一。
2、選擇動(dòng)態(tài)庫配套的頭文件及函數(shù)。點(diǎn)擊選擇頭文件按鈕,通過文件瀏覽的方式選擇test.h,選擇完成后在Methods下拉列表中會(huì)顯示從.h中解析出的所有函數(shù)。本示例選擇add函數(shù),如下圖一。
3、填寫完參數(shù)后,調(diào)用該函數(shù)。在Methods下拉列表中選擇add函數(shù)后,程序會(huì)自動(dòng)解析并將函數(shù)的所有參數(shù)展示在下方的表格中,填寫完入?yún)⒑螅c(diǎn)擊Invoke按鈕。本示例填寫的入?yún)?和8,如下圖一。
4、函數(shù)的出參或返回值會(huì)展示在對(duì)應(yīng)的位置。本示例的出參為48,返回值為14,如下圖二。(0xE是14的十六進(jìn)制等價(jià)顯示)
圖一
圖二
附錄關(guān)于參數(shù)數(shù)據(jù)格式的詳細(xì)說明
本工具將所有的數(shù)據(jù)類型歸為5大類:HEX、整數(shù)、字符串、單精度小數(shù)、雙精度小數(shù)。
HEX:為最基礎(chǔ)的數(shù)據(jù)類型,也是最強(qiáng)大的數(shù)據(jù)類型,可以用來表示任何數(shù)據(jù)類型(包括結(jié)構(gòu)體),其本質(zhì)為變量在內(nèi)存中的實(shí)際存儲(chǔ)結(jié)構(gòu),一般用來傳遞數(shù)組(十六進(jìn)制字符串)。其作為出參時(shí)只顯示內(nèi)容的第一個(gè)字節(jié),后面的內(nèi)容用*省略,可雙擊變量地址,根據(jù)實(shí)際情況輸入需要查看的長度,才可查看完整數(shù)據(jù)。
例如:inttemp1=1,則用HEX表示為:01000000,因?yàn)閕nt在內(nèi)存中是低字節(jié)在前,共占4個(gè)字節(jié)
unsignedchartemp2[]={0x12,0x34,0x56},則用HEX表示為:123456
chartemp3[]=“123456”,則用HEX表示為:313233343536.(因字符’1’的ASCII碼為49=0x31)
整數(shù):用來表示常見的數(shù)字類型的變量,例如int、long、short等。(如果unsignedchar用來表示整數(shù),也需要指定為整數(shù)類型)
字符串:用來表示可見字符串,例如“123456”,不可見字符串請(qǐng)用HEX類型(如上述temp2)。
單精度小數(shù):用來表示單精度小數(shù)類型,例如float
雙精度小數(shù):用來表示雙精度小數(shù)類型,例如double
注:工具中會(huì)自動(dòng)將帶&或*的參數(shù)識(shí)別為出參,其余的算作入?yún),如與實(shí)際情況不符,請(qǐng)自行調(diào)整。