溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

VB.NET如何聲明API

發(fā)布時(shí)間:2021-12-02 09:46:31 來(lái)源:億速云 閱讀:257 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了VB.NET如何聲明API,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

我們都知道在VB6里面可以用API函數(shù)來(lái)進(jìn)行子類(lèi)化,以處理自身的窗體過(guò)程;如果跨進(jìn)程,這就麻煩了,由于我們的函數(shù)在我們的進(jìn)程中(廢話(huà)),而目標(biāo)進(jìn)程的窗口的消息處理函數(shù)在目標(biāo)進(jìn)程(還是廢話(huà)),所以只能想辦法把我們的代碼放到對(duì)方進(jìn)程中去執(zhí)行——并且要告知我們的進(jìn)程得到了什么消息??峙聦?xiě)匯編就有點(diǎn)嚇人了,于是大家都寫(xiě)DLL,其原理就是把回調(diào)函數(shù)放到一個(gè)DLL里面注入到對(duì)方進(jìn)程,DLL去修改目標(biāo)窗口的默認(rèn)處理函數(shù)——把消息發(fā)送給我們。

當(dāng)然也有“另類(lèi)”一點(diǎn)的:http://www.it-berater.org/ThueDownloads/index.shtml上面有一個(gè) DLL包,其中含有一個(gè)dssubcls.dll,用它,可以輕松的完成我們的工作:就像調(diào)用一個(gè)API一樣簡(jiǎn)單,而且在我們的程序中使用回調(diào)函數(shù)!呵呵,省去了自己寫(xiě)DLL的麻煩之后,這些好處足以吸引各位觀(guān)眾了吧?

好了,VB6的代碼大家可以在下載的壓縮包中找到,作者提供了一個(gè)以記事本為基礎(chǔ)的實(shí)例(在\dssubcls目錄下),非常詳細(xì)無(wú)需詳細(xì)敘述了。關(guān)鍵是在VB.NET里面如何使用它——如何聲明API,如何進(jìn)行回調(diào),看用來(lái)子類(lèi)化的API的VB6聲明先:

Declare Function SubClass& Lib "dssubcls" (ByVal HwndSubclass&, _  Optional ByVal Address& = 0, _  Optional ByVal OldStyle& = 0, _  Optional ByVal NewStyle& = 0, _  Optional ByVal Ext& = 0, _  Optional ByVal SubClass& = 0)

轉(zhuǎn)化成VB.NET聲明API類(lèi)似下面的樣子(習(xí)慣使然,我把&展開(kāi)成了As Integer):

Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer,   Optional ByVal Address As Integer = 0, Optional ByVal OldStyle As Integer = 0,   Optional ByVal NewStyle As Integer = 0, Optional ByVal Ext As Integer = 0,   Optional ByVal SubClass As Integer = 0) As Integer

這不是很好嘛?問(wèn)題來(lái)了,這樣的聲明在VB6里面可以使用Addressof function來(lái)傳入第二個(gè)參數(shù)(參見(jiàn)你下載的源碼),但是在VB.NET里面直接Addressof就不成了——我們需要委托一個(gè)回調(diào):

  1. Private Delegate Function HookCallBack(ByVal wMsg As Integer, 
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer 

這個(gè)委托,對(duì)應(yīng)的是以下函數(shù):

  1. Private Function mCallback(ByVal wMsg As Integer, 
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer  

  2. ‘在這里處理得到的消息  

  3. End Function 

使用時(shí),需要注意先實(shí)例化這個(gè)委托:

Private fix_COCD = New HookCallBack(AddressOf mCallback)

此時(shí),fix_COCD就是我們的mCallback函數(shù)引用了,用更直觀(guān)的觀(guān)點(diǎn)來(lái)看,fix_COCD就是一個(gè)指向mCallback的指針,相當(dāng)于 VB6里面的Addressof function得到的結(jié)果,看似問(wèn)題解決了,于是我們寫(xiě)了以下代碼來(lái)搞對(duì)方的進(jìn)程窗體消息:

SubClass(Handle, fix_COCD, 0, 0, 0, 1) '修改處理函數(shù)

問(wèn)題真是接踵而至!IDE提示變量類(lèi)型不符!!事實(shí)確實(shí)如此,我們把一個(gè)HookCallBack類(lèi)型當(dāng)做Integer來(lái)傳遞,無(wú)法通過(guò)檢查,那么強(qiáng)行轉(zhuǎn)換吧?當(dāng)然,你可以去試試。這時(shí),我所做的是,修改這個(gè)API聲明:

  1. Private Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer, 
    Optional ByVal Address As HookCallBack = Nothing, Optional ByVal OldStyle As Integer = 0
    Optional ByVal NewStyle As Integer = 0, Optional ByVal Ext As Integer = 0
    Optional ByVal SubClass As Integer = 0) As Integet 

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“VB.NET如何聲明API”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI