在易語言中調(diào)用DLL使用說明_第1頁
在易語言中調(diào)用DLL使用說明_第2頁
在易語言中調(diào)用DLL使用說明_第3頁
在易語言中調(diào)用DLL使用說明_第4頁
在易語言中調(diào)用DLL使用說明_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、百度文庫讓每個人平等地提升自我易語言中調(diào)用DLL使用說明2005年11月大連大有吳濤易語言軟件開發(fā)有限公司基本說明本文所描述的部分功能需易語言或以上版本支持。“在易語言中調(diào)用DLL”包含兩方面的內(nèi)容:調(diào)用Windows系統(tǒng)API函數(shù);調(diào)用普通DLL函數(shù)。下文用到的“調(diào)用API”或“調(diào)用DLL”等字眼,除非特別注明,一般都是指以上兩方而之一或之和,視 上下文而定。絕大多數(shù)情況下,無需明確區(qū)分調(diào)用的是系統(tǒng)API還是普通DLL。目前易語言只支持以stdcall方式調(diào)用DLL中的導(dǎo)出函數(shù)。Windows系統(tǒng)API 一般都是以stdcall調(diào)用方式導(dǎo)出的,故在易語言中調(diào)用它們時通常不必考慮函數(shù)調(diào)用方 式

2、的問題。而普通DLL有可能導(dǎo)出“非stdcall調(diào)用方式”(比如cdecl)的函數(shù),調(diào)用時需要特別注意。一般而 言,考慮到通用性,DLL開發(fā)者都會選擇導(dǎo)出以sdtcall方式調(diào)用的函數(shù)。(支持生成DLL的編程語言通常都支 持導(dǎo)出stdcall調(diào)用方式的函數(shù),具體實(shí)現(xiàn)請參考各編程語言手冊。)特別地,在VC中類似如下代碼導(dǎo)出的函數(shù)并非stdcall調(diào)用方式:extern MCM_declspec (dllexport) test(int a. int b)(return (a + b);)要想該函數(shù)被易語言調(diào)用,應(yīng)該按類似如下方式定義(并在.def文本中聲明導(dǎo)出): int WINAPI test

3、 (int a, int b)(return (a + b);易語言編譯生成的DLL,其導(dǎo)出函數(shù)全部為stdcall調(diào)用方式,所以在易語言中調(diào)用易語言生成的DLL不存 在問題。目前在易語言中調(diào)用DLL時只支持1字節(jié)對齊的結(jié)構(gòu)(自定義數(shù)據(jù)類型)如果DLL命令的某個參數(shù)或參數(shù)的某個成員是結(jié)構(gòu)類型(自定義數(shù)據(jù)類型),則其對齊方式必須是1字節(jié) 對齊。Windows系統(tǒng)API中所用到的結(jié)構(gòu)都是1字5對齊的,故在調(diào)用API時不受此限制。但如果想用其它編 程語言生成DLL供易語言調(diào)用且數(shù)據(jù)類型中包含了 1或2字節(jié)數(shù)據(jù)長度的成員(如字符型或短整數(shù)),就需要 考慮結(jié)構(gòu)的1字節(jié)對齊。在VC中,可以這樣定義1字節(jié)對

4、齊的結(jié)構(gòu)(結(jié)構(gòu)在C/C+中稱為struct):#pragma pack (push, old vahie)D11命令名返回值類型公開備注DU命令1DZL:庫文件名:在DLL庫中對應(yīng)命令名;釜數(shù)名類型住址數(shù)姐備注DILI命令名返回值類型公開備注EhujtiD i spl ayDevices邏輯型枚舉顯示設(shè)備Dll庫文件名:user32. dll在Dll庫中對應(yīng)命令名:EnuffiDisplayDevieesA參數(shù)名類型傳址數(shù)組備注lpDevice文本型iUevffufTi整數(shù)型IpDi splayDevi ceDISPLAY JEHCEdwFlags整數(shù)型11。如果是Windows系統(tǒng)DLL的話

5、,可以省略不填??梢允褂媒^對路徑或相對路徑,使用相對路徑時路徑相對于當(dāng)前“.e”文件(調(diào)試運(yùn)行時)或當(dāng)前“.exe”文件(編譯后運(yùn)行時)??紤]到通用性,不建議在此處指定路徑,可在代碼中以“置DLL裝載目錄0動態(tài)指定被調(diào)用DLL的路徑。在DI1庫中對應(yīng)命令名指定被調(diào)用的DLL命令(或函數(shù))名稱。必須準(zhǔn)確填寫。名稱中的英文字母不區(qū)分大小寫。注意:某些帶文本參數(shù)的API,其函數(shù)名稱通常以“A”或“W結(jié)尾。如FindWindow函數(shù),其實(shí)中只有FindWindowA和FindWindowWt并沒有FindWindow所以我們在這里要填FindWindowA和FindWindowW而不是FindWind

6、ow0參數(shù)名定義該DLL命令在易語言中的名稱。必須填寫,但具體什么名稱并不重要。(DII參數(shù))類型定義該參數(shù)的實(shí)際類型所對應(yīng)的易語言類型??梢詾橐渍Z言自定義數(shù)據(jù)類型(該數(shù)據(jù)類型的成員必須與DLL所需數(shù)據(jù)類型的成員一一對應(yīng))。易語言中的數(shù)據(jù)類型與生成該DLL的編程語言中的數(shù)據(jù)類型并不完全一致,需進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換,詳見下文數(shù)據(jù)類型對照表。傳址如果選中本標(biāo)志,表示將傳遞參數(shù)的內(nèi)存首地址(類似C/C+中的傳指針參數(shù)或VB中的ByRef參數(shù)或Delphi中的var參數(shù));如果不選中本標(biāo)志,表示傳遞參數(shù)實(shí)際數(shù)據(jù)。應(yīng)根據(jù)該DLL的參數(shù)聲明或參數(shù)說明來決定是否使用“傳址”,詳見示例。此外,如果參數(shù)為文本型、字節(jié)

7、集型,或者為數(shù)組數(shù)據(jù),則總是傳址(而不管此處是否定義為傳址)。數(shù)組指定是否傳入數(shù)組數(shù)據(jù)。應(yīng)根據(jù)該DLL的參數(shù)聲明或參數(shù)說明來決定是否使用“數(shù)組”,詳見示例。(D11參數(shù))備注對該參數(shù)的注釋,可以不填。注:上表中所謂“實(shí)際(數(shù)據(jù))類型”表示在生成該DLL的編程語言中參數(shù)或返回值的數(shù)據(jù)類型。易語言與VB,C/C+.API的數(shù)據(jù)類型對照表(待更新):易語言VBC/C+,API整數(shù)型Longint,long,bookINT,LONGBOOL.DWORD.UINT.LRESUET.WPARAM,LPARAM,HWND,HFILE.HMODULE,.文本型Stringchar*,LPSTR.LPTSTR.

8、LPCSTR,LPCTSTR邏輯型Longint,INT.BOOL字節(jié)集型Void*,LPVOID小數(shù)型SingleFloat雙精度小數(shù)型Double,CurrencyDouble日期時間型DateDATE字節(jié)型Bytebyte,char,bool,BYTE,CHAR短整數(shù)型IntegerBooleanshort,SHORTWORD長整數(shù)型_int64.INT64注1:固定長度的文本(如VB中的“DimsAsString*32或C/C+中的“chars32注)在易語言中應(yīng)定義為相應(yīng)長度的字節(jié)型數(shù)組,并傳址。注2:各編程語言之間數(shù)據(jù)類型相互對照的一般原則是“所占內(nèi)存字節(jié)數(shù)相同”。注3:VB的In

9、teger.Bool均占兩個字節(jié)內(nèi)存,而易語言的“整數(shù)型”“邏輯型”均占四個字節(jié)內(nèi)存,注意區(qū)分。注4:如果不能確信其它編程語言中的某個數(shù)據(jù)類型對應(yīng)易語言的哪個類型,可首先嘗試“整數(shù)型”,然后可嘗試“字節(jié)集”(注意使用前以“取空白字節(jié)集()”等命令分配足夠的內(nèi)存空間)。注5:有些API(如FindWindow(A)的文本參數(shù)需要接收NULL值,有兩種處理方案:在易語言中將該參數(shù)定義為整數(shù)型并傳入0;在易語言中將該參數(shù)定義為文本型并傳入“字符(0)(在這里“字符(0)”類似于VB中的vbNuHString)。自定義數(shù)據(jù)類型如果DLL命令中有參數(shù)為結(jié)構(gòu)類型,就需要事先在易語言中定義與其對應(yīng)的自定義數(shù)

10、據(jù)類型。定義自定義數(shù)據(jù)類型的成員,與定義DLL命令的參數(shù)基本相同(具體含義請參考上文),只是有一點(diǎn)不同:如果DLL命令參數(shù)為數(shù)組,將忽略“傳址”設(shè)置并總是認(rèn)為“傳址”;但如果自定義數(shù)據(jù)類型成員為數(shù)組,“傳址”與否有不同的含義。此外,自定義數(shù)據(jù)類型的成員數(shù)組”屬性需指定一個明確的數(shù)值,而不象DLL命令參數(shù)那樣僅僅設(shè)置一個標(biāo)志。在自定義數(shù)據(jù)類型的成員為數(shù)組時,如果設(shè)置“傳址”,表示在此自定義數(shù)據(jù)類型中該成員位置處只存儲數(shù)組數(shù)據(jù)的內(nèi)存首地址:如果不設(shè)置傳址,表示在此自定義數(shù)據(jù)類型中該成員位置處的數(shù)據(jù)為所有數(shù)組數(shù)據(jù)的順序排放。至于如何判斷某自定義數(shù)據(jù)類型成員是否為“數(shù)組”及是否應(yīng)該“傳址”,則應(yīng)視具體

11、的自定義數(shù)據(jù)類型及其說明文檔而定,有時還需考慮該成員的“語義”。下面舉例說明,請看CPINFO這個結(jié)構(gòu)的C/C+定義及其對應(yīng)的易語言自定義數(shù)據(jù)類型:C/C+定義易語言定義struct_cpinfoUINT;BYTEMAX_DEFAULTCHAR;BYTEMAX_LEADBYTES;CPINFO,*LPCPINFO;數(shù)據(jù)類型名公開備注CFIfffO成員名類型傳址數(shù)組備注MxChrSize整數(shù)型DefaultChar字節(jié)型2LeadByte字節(jié)型12CPINFO的最后兩個成員都是字節(jié)型數(shù)組,且不是地址,所以應(yīng)將其分別定義為“字節(jié)型”“數(shù)組”(數(shù)組長度分別為MAX_DEFAULTCHAR和MAX_L

12、EADBYTES,查VC相應(yīng)頭文件得知兩個常量的值分別是2和12)。自定義數(shù)據(jù)類型成員是數(shù)組且需要“傳址”的情況比較少見,暫舉一例:C/C+定義易語言定義structx_InfoDWORD*value;CHAR*pChars:數(shù)據(jù)類型名公開備注XINFO成員名類型傳址數(shù)蛆備注value整數(shù)型qpChars字節(jié)型7256數(shù)據(jù)類型名公開備在DISPLAYJEYICE成員名類型傳址數(shù)組備注cT)整數(shù)型本數(shù)據(jù)類型的總字節(jié)數(shù)(168),使用前需初始化DeviceName字節(jié)型32DeviceString字節(jié)型128StateFlags整數(shù)型數(shù)據(jù)類型名公開備注BITMAP成員名類型傳址數(shù)組備注bmType

13、整數(shù)型binWiith整數(shù)型bmHeight整數(shù)型bmWiAthByts整數(shù)型bmPLanes短整數(shù)型bmBitsFixel短整數(shù)型bmBiis字節(jié)集7DILI命令名返回值類型公開備注GetDC整數(shù)型股指定窗口的設(shè)備上下文句柄皿1庫文件名:user32.dll在D11庫中對應(yīng)命令名:GetDC參數(shù)名類型傳址數(shù)組備注h-And整數(shù)型窗口句柄DILI命令名返回值類型公開備注ReleaseDC邏輯型釋放GetDC所獲取的設(shè)備上下文句柄Dll庫文件名:user32.dll在D11庫中對鹿命今名:ReleaseDC參數(shù)名類型傳址數(shù)組備注Md整數(shù)型KDC整數(shù)型Thefirststructurespecif

14、iesthestartingpoint.Theremainingpointsareingroupsofthree,consistingoftwocontrolpointsandanendpoint.ePointsLong,Ippt數(shù)組的總點(diǎn)數(shù)根據(jù)上表,可以得知,PolyBezier函數(shù)位于動態(tài)庫“gdi32”中;返回值類型為Long,根據(jù)語義我們選擇定義為易語言中的“邏輯型”(理由同上);第一個和第三個參數(shù)都是Long,均對應(yīng)易語言中的“整數(shù)型”;第二個參數(shù),根據(jù)參數(shù)說明可知它是一個“指向POINTAPI結(jié)構(gòu)數(shù)組的指針”,參數(shù)類型為“POINTAPI”(后面將為這個結(jié)構(gòu)定義一個易語言自定義數(shù)據(jù)

15、類型),“數(shù)組”,“傳址:根據(jù)以上分種,得到了易語言DLL調(diào)用表:DILI命令名返回值類型公開備注FolyBezier整數(shù)型畫貝賽爾曲線Dll庫文件名:gdi32在DL1庫中對應(yīng)命令名;PolyBezier參數(shù)名類型傳址數(shù)組備注hUC整數(shù)型設(shè)備上下文句柄IpptrOIBTATIV*各點(diǎn)坐標(biāo)cPoints整數(shù)型點(diǎn)的個數(shù)因?yàn)樯厦嬗玫搅私Y(jié)構(gòu)POINTAPI,我們需要將它定義為易語言自定義數(shù)據(jù)類型。它有兩個成員,參數(shù)都是Long,對應(yīng)易語言中的“整數(shù)型”:數(shù)據(jù)類型名公開備注POIHTAFI成員名類型傳址數(shù)組備注X整數(shù)型y整數(shù)型到此為止,己將所需的DLL命令及其自定義數(shù)據(jù)類型定義好了,下而就可以象調(diào)用易

16、語言普通子程序一樣調(diào)用這幾個DLL命令了:子程序名|返回值類型|公開|備注弟鈕.畫貝賽爾曲線_被單擊變量名類型靜態(tài)數(shù)組備注pointsPOIBTAPI7hIC整數(shù)型j整數(shù)型畫板1.清除L置隨機(jī)數(shù)種子0計(jì)次循環(huán)首映數(shù)組成員數(shù)(pointyi);pointsi.ic=取隨機(jī)數(shù)(L,畫板1.寬度);pointsi,y=取隨機(jī)數(shù)(1,圓板L高度):一計(jì)次循環(huán)尾。hDC=GetDC畫板L取窗口句柄0)FlyBezirChDC,points,取數(shù)組成員數(shù)(points)ReleaseDC畫稅1.取窗口句柄0,hUC)其它的DLL命令調(diào)用表實(shí)例:DILI命令名返回值類型公開備注OpenPrinter邏輯型D

17、ILI庫文件名:winspool. drv在DLL庫中對應(yīng)命令名;Op enP ri nt er A參數(shù)名類型住址數(shù)組備注pTrinterNajrie文本型phFrinter整數(shù)型ypBefault整數(shù)型D11命令名返回值類型公開備注邏輯型Dll庫文件名:Comdlg32在DLL庫中對應(yīng)命令名:GetOp enFi leNam eA參數(shù)名類型傳址數(shù)組備注Ipofn.lagOFN3注意上面兩圖的“在D11庫中對應(yīng)命令名”一欄,命令最后都有一個字符“A”,在其VB聲明中就可找出其來源:DeclareFunctionOpenPrinterLibAliasOpenPrinterA*(ByVaipPri

18、nterNameAsString.phPrinterAsLong,pDefaullAsPRINTER.DEFAULTS)AsLongDeclareFunctionGetOpenFileNameLibcomdlg32MAlias”GetOpenFileNanKA,(IpofnAslagOFN)AsLong小結(jié):我們選擇了幾個比較復(fù)雜的、有代表性的DLL調(diào)用,詳細(xì)分析并描述了從定義到調(diào)用的全過程。希望本示例能夠幫助用戶理解并學(xué)會使用在易語言中調(diào)用DLL命令,同時希望本示例已經(jīng)向用戶展示出了易語言對DLL調(diào)用的支持已足夠完善并趨于完美。下一步,易語言將封裝所有常用的API及相應(yīng)的自定義數(shù)據(jù)類型,以免去用戶需自行定義DLL和自定義數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論