溫馨提示×

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

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

易語(yǔ)言API高級(jí)技巧的示例分析

發(fā)布時(shí)間:2021-08-18 11:29:23 來(lái)源:億速云 閱讀:150 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)易語(yǔ)言API高級(jí)技巧的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

1,使用指針

易言語(yǔ)中出于安定、方便考慮,沒有直接提供指針,這正在進(jìn)行一些高級(jí) 縱時(shí)不是很方便,固然有一些第三方支撐庫(kù)可以取出變量指針(比如我的eLib++ 注:該支撐庫(kù)系Delphi開發(fā),本人已開放源代 ,你可以到易言語(yǔ)下載區(qū)瞧瞧)但是僅僅為了這個(gè) 縱就帶上一個(gè)支撐庫(kù)不太值得。實(shí)在用一個(gè)API,加上一些技術(shù)就可以欺騙Windows和易言語(yǔ),讓它們報(bào)告你一個(gè)變量的指針。
這個(gè)API是lstrcpyn。用過(guò)C開發(fā)Windows下的步驟的朋友可能對(duì)這個(gè)API相比熟識(shí),就是字符串拷貝。正在windows下取代C準(zhǔn)則庫(kù)函數(shù)strncpy的。字符串拷貝怎樣能獲得變量指針呢?秘密就正在這個(gè)API的返回值:

瞧瞧MSDN:“If the function succeeds, the return value is a pointer to the buffer”

該函數(shù)把第二個(gè)參數(shù)指定的字符串雙制到第一個(gè)參數(shù)指定的字符串,第三個(gè)參數(shù)指定雙制的長(zhǎng)度。假如雙制成功,返回第一個(gè)參數(shù)(緩沖區(qū)buffer)的地點(diǎn)。瞧到了嗎?它返回第一個(gè)參數(shù)的地點(diǎn)??!那么我們把需求取地點(diǎn)的變量給它的第一個(gè)參數(shù),然后想要領(lǐng)讓它雙制成功,它不就返回了那個(gè)變量的地點(diǎn)了嗎?

界說(shuō)一個(gè)DLL命令如下:

Dll命令:取文本指針

返回值類型:整數(shù)型

正在Dll庫(kù)中的命令名:lstrcpyn

參數(shù):欲取其指針的文本 數(shù)據(jù)類型:文本型 <傳址>

參數(shù):欲取其指針的文本 數(shù)據(jù)類型:文本型 <傳址>

參數(shù):保存 數(shù)據(jù)類型:整數(shù)型 備注:0

這樣挪用:

文本1 = “abcdefg”

指針1 = 取文本指針 (文本1, 文本1, 0)

把文本1雙制到自己,雙制長(zhǎng)度為0字節(jié)(也就是什么都不雙制),然后返回文本1的指針。就這么簡(jiǎn)略。先報(bào)告Windows我要雙制一個(gè)文本到某個(gè)內(nèi)存地點(diǎn),但同時(shí)報(bào)告它我什么都不雙制,它實(shí)踐上幫你取出了這個(gè)文本的指針。

上面的例子是取文本的指針,其他類型的變量也一樣的,由于正在API內(nèi)部(實(shí)在是正在內(nèi)存中)什么類型的變量都體現(xiàn)為一塊內(nèi)存區(qū)域,原理是一樣的。但是易言語(yǔ)是強(qiáng)制類型的言語(yǔ),所以這次要騙騙易言語(yǔ)了,呵呵,再界說(shuō)這個(gè)API的一個(gè)新版本,把它的參數(shù)界說(shuō)成你想要的類型就可以了。

Dll命令:取整數(shù)指針

返回值類型:整數(shù)型

正在Dll庫(kù)中的命令名:lstrcpyn

參數(shù):欲取其指針的整數(shù) 數(shù)據(jù)類型:整數(shù)型 <傳址> 備注:一定要傳址

參數(shù):欲取其指針的整數(shù) 數(shù)據(jù)類型:整數(shù)型 <傳址> 備注:一定要傳址.重雙一次

參數(shù):保存 數(shù)據(jù)類型:整數(shù)型 備注:0

2,非凡的結(jié)構(gòu)用字節(jié)集代替

Window98及其后的 縱零碎提供了一個(gè)非常棒的API :GradientFill,利用這個(gè)API可以方便地畫出漸變的效果。

這個(gè)API倒不是很麻煩,參考MSDN我們很快就可以正在易言語(yǔ)中界說(shuō)出這個(gè)DLL命令:(以漸變填充矩形為例)

Dll命令:GradientFill

返回值類型:邏輯型

Dll庫(kù)文件名:Msimg32.dll

正在Dll庫(kù)中的命令名:GradientFill

參數(shù):hDC 數(shù)據(jù)類型:整數(shù)型

參數(shù):pVertex 數(shù)據(jù)類型:TRIVERTEX

參數(shù):dwNumVertex 數(shù)據(jù)類型:整數(shù)型

參數(shù):pMesh 數(shù)據(jù)類型:GRADIENT_RECT

參數(shù):dwNumMesh 數(shù)據(jù)類型:整數(shù)型

參數(shù):dwMode 數(shù)據(jù)類型:整數(shù)型

其中TRIVERTEX 和GRADIENT_RECT時(shí)自界說(shuō)的數(shù)據(jù)類型:

自界說(shuō)數(shù)據(jù)類型:TRIVERTEX

成員:x 數(shù)據(jù)類型:整數(shù)型

成員:y 數(shù)據(jù)類型:整數(shù)型

成員:Red 數(shù)據(jù)類型:短整數(shù)型

成員:Green 數(shù)據(jù)類型:短整數(shù)型

成員:Blue 數(shù)據(jù)類型:短整數(shù)型

成員:Alpha 數(shù)據(jù)類型:短整數(shù)型

自界說(shuō)數(shù)據(jù)類型:GRADIENT_RECT

成員:UpperLeft 數(shù)據(jù)類型:整數(shù)型

成員:LowerRight 數(shù)據(jù)類型:整數(shù)型

憑據(jù)MSDN的闡明,基礎(chǔ)沒有標(biāo)題,但是假如你挪用這個(gè)函數(shù),你不會(huì)成功的。為什么?我報(bào)告你緣由正在TRIVERTEX的界說(shuō)上。你或許會(huì)說(shuō),這個(gè)沒有標(biāo)題啊,MSDN上界說(shuō)如下:

typedef struct _TRIVERTEX {
LONG x;
Long y;
COLOR16 Red;
COLOR16 Green;
COLOR16 Blue;
COLOR16 Alpha;
}TRIVERTEX, *PTRIVERTEX;

C言語(yǔ)的LONG 和Long正在Windows 32位下是32位,對(duì)應(yīng)于易言語(yǔ)“整數(shù)型”,COLOR16為十六位,對(duì)應(yīng)于易言語(yǔ)的“短整數(shù)型”沒有標(biāo)題??!那假如我再報(bào)告你,易言語(yǔ)中的自界說(shuō)數(shù)據(jù)類型的成員均是四字節(jié)對(duì)齊的,你該理解了吧。是的,易言語(yǔ)中的自界說(shuō)數(shù)據(jù)類型的成員均是四字節(jié)對(duì)齊的,假如不敷四字節(jié),會(huì)主動(dòng)對(duì)齊到四字節(jié)的。具體到上面的界說(shuō),Red,Green,Blue,Alpha固然被界說(shuō)為“短整數(shù)型”但是正在易言語(yǔ)內(nèi)部,它們均被擴(kuò)充為“整數(shù)型”了。這就是題手法泉源。解決的要領(lǐng)就是用字節(jié)集代替自界說(shuō)數(shù)據(jù)結(jié)構(gòu)。易言語(yǔ)的字節(jié)集不存正在四字節(jié)對(duì)齊的標(biāo)題。

Dll命令:GradientFill
返回值類型:邏輯型
Dll庫(kù)文件名:Msimg32.dll
正在Dll庫(kù)中的命令名:GradientFill
參數(shù):hDC 數(shù)據(jù)類型:整數(shù)型
參數(shù):pVertex 數(shù)據(jù)類型:字節(jié)集
…… ………………..

這樣界說(shuō)就可以了。為了方便地生產(chǎn)所需求的字節(jié)集數(shù)據(jù),我有界說(shuō)了一個(gè)子步驟:

子步驟:TRIVERTEX到字節(jié)集
返回值類型:字節(jié)集
備注:由于內(nèi)存對(duì)齊的緣由,務(wù)必把TRIVERTEX類型轉(zhuǎn)換為字節(jié)集才可以挪用API成功

參數(shù):VertEX 數(shù)據(jù)類型:TRIVERTEX <數(shù)組>

局部變量:元素個(gè)數(shù) 數(shù)據(jù)類型:整數(shù)型
局部變量:變量 數(shù)據(jù)類型:整數(shù)型
局部變量:數(shù)據(jù) 數(shù)據(jù)類型:字節(jié)集

元素個(gè)數(shù) = 取數(shù)組成員數(shù) (VertEX)
計(jì)次循環(huán)首 (元素個(gè)數(shù), 變量)
數(shù)據(jù) = 數(shù)據(jù) + 到字節(jié)集 (VertEX [變量].x)
數(shù)據(jù) = 數(shù)據(jù) + 到字節(jié)集 (VertEX [變量].y)
數(shù)據(jù) = 數(shù)據(jù) + 到字節(jié)集 (VertEX [變量].Red)
數(shù)據(jù) = 數(shù)據(jù) + 到字節(jié)集 (VertEX [變量].Green)
數(shù)據(jù) = 數(shù)據(jù) + 到字節(jié)集 (VertEX [變量].Blue)
數(shù)據(jù) = 數(shù)據(jù) + 到字節(jié)集 (VertEX [變量].Alpha)
計(jì)次循環(huán)尾 ()
返回 (數(shù)據(jù))

具體的請(qǐng)瞧附帶的例程

其他具有類似特 (參數(shù)或結(jié)構(gòu)中有非四字節(jié)的)的API都可以用上述的要領(lǐng)來(lái)變通解決。

感謝各位的閱讀!關(guān)于“易語(yǔ)言API高級(jí)技巧的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎ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