如何使用一个库中不存在的函数
?Windows是一個不斷發(fā)展的系統(tǒng),很多新的 API 在操作系統(tǒng)更新時更新,而MASM32開發(fā)包一般在很長一段時間內(nèi)都無法及時更新,如果需要在編程中使用新添加的API函數(shù)。就得自己動手來更手庫文件,下面我就給大家介紹一下如何通過手動的方法添加新的 API。為了便于說明,我們以 GetConsoleWindow 這個API為例。這個函數(shù)能夠取得當(dāng)前程序所在控制臺的句柄。具體說明請參考后面的注釋。MasmPlus 已經(jīng)定義了這個函數(shù),在你敲入函數(shù)名時會自動彈出提示:
??
??但是,在編譯中會出現(xiàn)無法識別的錯誤,這是因為 MASM32 包這個函數(shù)根本沒有引用,在對應(yīng)的LIB中缺少聲明,我們的編譯器不認(rèn)識它。???
??
??如果這個函數(shù)權(quán)權(quán)只是沒有聲明,那在你的代碼中使用:
??GetConsoleWindow PROTO :DWORD.....?
??聲明就可以。有多少個參數(shù)就有多少個DWORD。還需要引用目錄庫文件,比如INCLUDE xxx.lib ;如果說LIB中也沒有,那要使用LIB工具成生LIB。首先要知道GetConsoleWindow 函數(shù)在哪個DLL中。在 MSDN 中搜索到這個函數(shù),在 QUICK INFO中,可以看到它所在的DLL是哪一個.
??假設(shè)為Kernel32.dll,然后,新建一個kernel32.inc 的文檔,注意文件名必須和目標(biāo)函數(shù)所在DLL一樣,在里面加入:
??GetConsoleWindow PROTO :DWORD....?
??具體參數(shù)有多少個,參考MSDN。同時,要把其它的函數(shù)都添加好。否則生成的庫文件只有一個函數(shù)引用。比如,原本就有一個kernel32.inc的文檔,只是沒有這個函數(shù)的聲明,那就直接添加到已有的inc里面,如果是不存在的函數(shù),在導(dǎo)出時,會顯示錯誤,但不會停止。然后使用MASM32包里面的 INC2L.exe ,直接調(diào)用加上參數(shù)就可以生成Kernel32.lib,如:inc2l kernel32.inc
??要注意的是,inc2l也是使用ml和link來建立庫的,所要要保證環(huán)境中能找到它們。可以使用inc2l /?來查看幫助。它的要求是,使用環(huán)境變量 set mdir=drv:\path來確定link在哪里。
??這里處理完了,如果需要在MASMPlus中能夠列出函數(shù)原型,還需要添加到安裝目錄下的Files\keywords.stx這個文檔中。打開后找到API所在的段如:#KEY10,添加格式為:
??GetConsoleWindow==hConsole,lpsss......
??這里也是按MSDN而來。如果沒有參數(shù),直接留空。如果一個函數(shù)需要在輸入時列出一些常數(shù),可以寫為下面的格式:
??GetConsoleWindow==hConsole,fFlags[GCW_]
??意思是在 MASMPlus 輸入時,在GetConsoleWindow的第二個參數(shù)時,列出所有以GCW_開頭的常數(shù)。如果還有UNICODE和ANSI之分,參數(shù)個數(shù)都是一樣的,可以使用轉(zhuǎn)向:
??GetConsoleWindowA==<GetConsoleWindow>
??GetConsoleWindowW==<GetConsoleWindow>
??意思是無論是GetConsoleWindowA還是GetConsoleWindowW,都使用與GetConsoleWindow相同的設(shè)置。
??實際操作:
1.首先在MSDN上查找 GetConsoleWindow ,上面指出該API存在于 Kernel32.Lib中。
??
???
2.打開\MASMPlus\Include\ kernel32.inc,發(fā)現(xiàn)其中并沒有定義這個函數(shù)。
??我們嘗試在程序中直接聲明
??
??編譯仍然有錯誤
??
??這時我們就要嘗試在 Kernel32.LIB 中添加內(nèi)容。
3.在打開的kernel32.inc末尾添加如下代碼:
??GetConsoleWindow PROTO
??然后將 kernel32.inc 拷貝到有inc2l.exe工具的目錄下,我機(jī)器上這個工具位于
E:\masm32\tools\INC2L 目錄下,使用 inc2l kernel32.inc 生成kernel32.lib
??
4.將生成的kernel32.lib拷貝到\MASMPlus\Lib目錄下覆蓋掉原來的即可。
??
??最終重新編譯我們的程序(程序中不需要聲明)通過。
??上面只是演示如何聲明一個庫中沒有的函數(shù),至于如何設(shè)置自動提示的功能,請讀者自己回去試演。
參考1:http://msdn2.microsoft.com/en-us/library/ms683175.aspx
參考2:本文使用的程序例子
;#Mode=CON
;MASMPlus 單文件代碼模板 - 控制臺程序
;--------------------------------------------------------------------
;單個文件需要指定編譯模式,否則默認(rèn)是EXE方式,在系統(tǒng)設(shè)置中可以設(shè)置默認(rèn)是DOS還是Windows.
;編譯模式自帶了DOS/COM/CON/EXE/DLL/LIB這幾種,如果有必要,可以更改ide.ini添加新的編譯模式
;當(dāng)然,更好的是創(chuàng)建為一個工程.更方便及易于管理,使用方法:按Ctrl多選->創(chuàng)建工程.必須有多個文件
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data?
???buffer???db 100 dup(?)
.CODE
START:
?? invoke GetConsoleWindow
???
?? invoke ShowWindow,eax,SW_MINIMIZE?
???
???;暫停顯示,回車鍵關(guān)閉
???invoke StdIn,addr buffer,sizeof buffer
???invoke ExitProcess,0
???
end START
以上為裝載內(nèi)容,請尊重原作者的辛勤勞動。裝載請注明出處。謝謝:
原出處:http://www.aogosoft.com/downpage.asp?mode=viewtext&id=138
轉(zhuǎn)載于:https://www.cnblogs.com/ziolo/p/3421962.html
總結(jié)
以上是生活随笔為你收集整理的如何使用一个库中不存在的函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN之使用原则
- 下一篇: 编译出现ARM与THUMB冲突