如果你不知道別人DLL的接口,那么你是無法調(diào)用的,但是如果你知道接口的話,可以點(diǎn)擊菜單“插入”-“DLL命令”,然后DLL命令可以自己取,DLL庫文件名就是別人的DLL文件名,在DLL庫中對(duì)應(yīng)命令名就是別人DLL庫里的某個(gè)函數(shù)名,這樣你就可以調(diào)用了,至于函數(shù)的參數(shù),也要按照原先別人定義的寫上去,順序不能錯(cuò)
為永安等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及永安網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、永安網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
首先,不知道樓主對(duì)HOOK 知識(shí)如何,如果對(duì)HOOK知識(shí)不是很了解的話,看看一樓的基本知識(shí),如果明白的話,幫你解釋下 在易語言里 如何 實(shí)現(xiàn)鉤子 以及 鉤子函數(shù)
首先 第一步 注冊鉤子:鉤子句柄 = SetWindowsHookEx (13, 鉤子函數(shù), GetModuleHandleA (0), 0)
這里可以看到 第二個(gè)參數(shù) 使我們的鉤子函數(shù),遇到函數(shù) 指針參數(shù)時(shí) 需要在函數(shù)名前加
符號(hào) 以說明傳遞的是函數(shù)的指針,
第二步 鉤子函數(shù): .版本 2
.子程序 鉤子函數(shù), 整數(shù)型, ,
.參數(shù) icode, 整數(shù)型
.參數(shù) wparam, 整數(shù)型
. 參數(shù) lparam, 整數(shù)型 這是這個(gè)函數(shù)的定義,這個(gè)函數(shù)必須要這么定義才可以,參數(shù)數(shù)量和類型
以及返回值必須按照這個(gè)定義,在這個(gè)函數(shù)里 可以進(jìn)行消息攔截處理,不過要記住一旦你處理了消息要返回1 告知系統(tǒng)這個(gè)消息被你攔截處理了,否則要 返回 CallNextHookEx (鉤子句柄, icode, wparam, lparam) 以便系統(tǒng)執(zhí)行其他的鉤子
第三步 就是卸載鉤子UnhookWindowsHookEx (鉤子句柄)
Marshal.GetDelegateForFunctionPointer()
Marshal.GetFunctionPointerForDelegate()
用這兩個(gè)方法可以在函數(shù)指針與委托之間轉(zhuǎn)換
你問這個(gè)問題有點(diǎn)含糊.在Windows中不同的領(lǐng)域的回調(diào)函數(shù)是不同的.例如在創(chuàng)建窗口中使用的窗口函數(shù)是在窗口類中填寫,然后使用API注冊.
不過簡單的來說.得先按照API的要求編寫一個(gè)函數(shù).例如創(chuàng)建窗口要求的消息處理回調(diào)函數(shù)的結(jié)構(gòu)是:
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)
那么你就得按照這個(gè)結(jié)構(gòu)設(shè)計(jì)一個(gè)函數(shù):LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam).然后填寫窗口類進(jìn)行注冊.
注意每一種回調(diào)函數(shù)都有其其特定的結(jié)構(gòu),你的按照他的結(jié)構(gòu)來編寫函數(shù).這個(gè)消息回調(diào)的返回值是類型是LRESULT那么你設(shè)計(jì)的函數(shù)的返回值就要是這個(gè)類型,同樣的參數(shù)有HWND等類型,那么你設(shè)計(jì)回調(diào)函數(shù)時(shí)就得按照這些類型多一個(gè)少一個(gè)都不行,參數(shù)類型也一個(gè)不能變.
另外Windows回調(diào)函數(shù)都是要在函數(shù)名之前,返回值之后有一個(gè)CALLBACK,這是一個(gè)宏.表示這個(gè)函數(shù)是一個(gè)回調(diào)函數(shù).而這個(gè)宏所代表的實(shí)際值是_stdcall,這是C++語言中的一種函數(shù)調(diào)用方式.表示參數(shù)由后到前,即后面的參數(shù)先被放進(jìn)堆棧,然后前面的參數(shù)在一次入棧,函數(shù)執(zhí)行完畢之后由被調(diào)用函數(shù)清理堆棧里的參數(shù).其實(shí)Windows里的不少調(diào)用方式宏都是代表_stdcall的,如WINAPI.所以回調(diào)函數(shù)你也可以用WINAPI或者直接用_stdcall來表示調(diào)用方式.不過我反對(duì)這種方法.此外C++語言里面還有_cdecl(好像是這個(gè)名字吧)調(diào)用方式,它的參數(shù)入棧和_stdcall一樣,但是它是由調(diào)用函數(shù)清理堆棧內(nèi)參數(shù),這種調(diào)用方式使得參數(shù)的數(shù)量可以變化(就像printf函數(shù)一樣).更深一層說_stdcall是被調(diào)用者在最后執(zhí)行ret n指令返回,(n是一個(gè)整數(shù),決定于參數(shù)數(shù)量)._cdecl是在call指令進(jìn)行函數(shù)調(diào)用完畢之后執(zhí)行add esp,n(n同上).這段不理解就算反正你就記住回調(diào)函數(shù)前用CALLBACK即可.
callback Function
回調(diào)函數(shù)是應(yīng)用程序提供給Windows系統(tǒng)DLL或其它DLL調(diào)用的函數(shù),一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件。應(yīng)用程序把回調(diào)函數(shù)的地址指針告訴DLL,而DLL在適當(dāng)?shù)臅r(shí)候會(huì)調(diào)用該函數(shù)?;卣{(diào)函數(shù)必須遵守事先規(guī)定好的參數(shù)格式和傳遞方式,否則DLL一調(diào)用它就會(huì)引起程序或系統(tǒng)的崩潰。通常情況下,回調(diào)函數(shù)采用標(biāo)準(zhǔn)WindowsAPI的調(diào)用方式,即__stdcall,當(dāng)然,DLL編制者可以自己定義調(diào)用方式,但客戶程序也必須遵守相同的規(guī)定。在__stdcall方式下,函數(shù)的參數(shù)按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數(shù)都按值傳遞,函數(shù)返回之前自己負(fù)責(zé)把參數(shù)從堆棧中彈出。
理解回調(diào)函數(shù)!
程序在調(diào)用一個(gè)函數(shù)(function)時(shí)(通常指api).相當(dāng)于程序(program)呼叫(Call)了一個(gè)函數(shù)(function)關(guān)系表示如下:
call(調(diào)用)
program --------------------→ dll
程序在調(diào)用一個(gè)函數(shù)時(shí),將自己的函數(shù)的地址作為參數(shù)傳遞給程序調(diào)用的函數(shù)時(shí)(那么這個(gè)自己的函數(shù)稱回調(diào)函數(shù)).需要回調(diào)函數(shù)的 DLL 函數(shù)往往是一些必須重復(fù)執(zhí)行某些操作的函數(shù).關(guān)系表示如下:
call(調(diào)用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回調(diào))
當(dāng)你調(diào)用的函數(shù)在傳遞返回值給回調(diào)函數(shù)時(shí),你就可以利用回調(diào)函數(shù)來處理或完成一定的操作。至于如何定義自己的回調(diào)函數(shù),跟具體使用的API函數(shù)有關(guān),很多不同類別的回調(diào)函數(shù)有各種各樣的參數(shù),有關(guān)這些參數(shù)的描述一般在幫助中有說明回調(diào)函數(shù)的參數(shù)和返回值等.其實(shí)簡單說回調(diào)函數(shù)就是你所寫的函數(shù)滿足一定條件后,被DLL調(diào)用!
也有這樣的說法(比較容易理解):
回調(diào)函數(shù)就好像是一個(gè)中斷處理函數(shù),系統(tǒng)在符合你設(shè)定的條件時(shí)自動(dòng)調(diào)用。為此,你需要做三件事:
1. 聲明;
2. 定義;
3. 設(shè)置觸發(fā)條件,就是在你的函數(shù)中把你的回調(diào)函數(shù)名稱轉(zhuǎn)化為地址作為一個(gè)參數(shù),以便于DLL調(diào)用。
當(dāng)前題目:c回調(diào)函數(shù)易語言 c的回調(diào)函數(shù)
文章網(wǎng)址:http://jinyejixie.com/article8/dodopop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、外貿(mào)建站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站營銷、App設(shè)計(jì)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)