日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用一个库中不存在的函数

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用一个库中不存在的函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?Windows是一個不斷發展的系統,很多新的 API 在操作系統更新時更新,而MASM32開發包一般在很長一段時間內都無法及時更新,如果需要在編程中使用新添加的API函數。就得自己動手來更手庫文件,下面我就給大家介紹一下如何通過手動的方法添加新的 API。為了便于說明,我們以 GetConsoleWindow 這個API為例。這個函數能夠取得當前程序所在控制臺的句柄。具體說明請參考后面的注釋。MasmPlus 已經定義了這個函數,在你敲入函數名時會自動彈出提示:

??

??但是,在編譯中會出現無法識別的錯誤,這是因為 MASM32 包這個函數根本沒有引用,在對應的LIB中缺少聲明,我們的編譯器不認識它。???

??

??如果這個函數權權只是沒有聲明,那在你的代碼中使用:

??GetConsoleWindow PROTO :DWORD.....?

??聲明就可以。有多少個參數就有多少個DWORD。還需要引用目錄庫文件,比如INCLUDE xxx.lib ;如果說LIB中也沒有,那要使用LIB工具成生LIB。首先要知道GetConsoleWindow 函數在哪個DLL中。在 MSDN 中搜索到這個函數,在 QUICK INFO中,可以看到它所在的DLL是哪一個.

??假設為Kernel32.dll,然后,新建一個kernel32.inc 的文檔,注意文件名必須和目標函數所在DLL一樣,在里面加入:

??GetConsoleWindow PROTO :DWORD....?

??具體參數有多少個,參考MSDN。同時,要把其它的函數都添加好。否則生成的庫文件只有一個函數引用。比如,原本就有一個kernel32.inc的文檔,只是沒有這個函數的聲明,那就直接添加到已有的inc里面,如果是不存在的函數,在導出時,會顯示錯誤,但不會停止。然后使用MASM32包里面的 INC2L.exe ,直接調用加上參數就可以生成Kernel32.lib,如:inc2l kernel32.inc

??要注意的是,inc2l也是使用ml和link來建立庫的,所要要保證環境中能找到它們??梢允褂胕nc2l /?來查看幫助。它的要求是,使用環境變量 set mdir=drv:\path來確定link在哪里。

??這里處理完了,如果需要在MASMPlus中能夠列出函數原型,還需要添加到安裝目錄下的Files\keywords.stx這個文檔中。打開后找到API所在的段如:#KEY10,添加格式為:

??GetConsoleWindow==hConsole,lpsss......

??這里也是按MSDN而來。如果沒有參數,直接留空。如果一個函數需要在輸入時列出一些常數,可以寫為下面的格式:

??GetConsoleWindow==hConsole,fFlags[GCW_]

??意思是在 MASMPlus 輸入時,在GetConsoleWindow的第二個參數時,列出所有以GCW_開頭的常數。如果還有UNICODE和ANSI之分,參數個數都是一樣的,可以使用轉向:

??GetConsoleWindowA==<GetConsoleWindow>
??GetConsoleWindowW==<GetConsoleWindow>

??意思是無論是GetConsoleWindowA還是GetConsoleWindowW,都使用與GetConsoleWindow相同的設置。

??實際操作:

1.首先在MSDN上查找 GetConsoleWindow ,上面指出該API存在于 Kernel32.Lib中。

??
???
2.打開\MASMPlus\Include\ kernel32.inc,發現其中并沒有定義這個函數。

??我們嘗試在程序中直接聲明

??

??編譯仍然有錯誤

??

??這時我們就要嘗試在 Kernel32.LIB 中添加內容。


3.在打開的kernel32.inc末尾添加如下代碼:

??GetConsoleWindow PROTO

??然后將 kernel32.inc 拷貝到有inc2l.exe工具的目錄下,我機器上這個工具位于
E:\masm32\tools\INC2L 目錄下,使用 inc2l kernel32.inc 生成kernel32.lib

??

4.將生成的kernel32.lib拷貝到\MASMPlus\Lib目錄下覆蓋掉原來的即可。
??
??最終重新編譯我們的程序(程序中不需要聲明)通過。

??上面只是演示如何聲明一個庫中沒有的函數,至于如何設置自動提示的功能,請讀者自己回去試演。

參考1:http://msdn2.microsoft.com/en-us/library/ms683175.aspx

參考2:本文使用的程序例子

;#Mode=CON
;MASMPlus 單文件代碼模板 - 控制臺程序
;--------------------------------------------------------------------
;單個文件需要指定編譯模式,否則默認是EXE方式,在系統設置中可以設置默認是DOS還是Windows.
;編譯模式自帶了DOS/COM/CON/EXE/DLL/LIB這幾種,如果有必要,可以更改ide.ini添加新的編譯模式
;當然,更好的是創建為一個工程.更方便及易于管理,使用方法:按Ctrl多選->創建工程.必須有多個文件

.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?
???
???;暫停顯示,回車鍵關閉
???invoke StdIn,addr buffer,sizeof buffer
???invoke ExitProcess,0
???
end START

以上為裝載內容,請尊重原作者的辛勤勞動。裝載請注明出處。謝謝:

原出處:http://www.aogosoft.com/downpage.asp?mode=viewtext&id=138

轉載于:https://www.cnblogs.com/ziolo/p/3421962.html

總結

以上是生活随笔為你收集整理的如何使用一个库中不存在的函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。