微剋多資訊

 找回密碼
 註冊

Sign in with google

Google帳號登入

搜索
回覆 1則 瀏覽 18715篇
Line

[教學] AutoIt Dll 使用教學

該用戶從未簽到

升級   100%

跳轉到指定樓層
主題
發表於 2012-10-24 16:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 edisonx 於 2012-11-5 23:51 編輯

壹、AutoIt 系統常用之 DLL 說明


[轉載][A] AutoIt!! DLL 說明 (幼幼幼班) < 轉自筆者 EdisonX 部落格 >

0. 前言

關於 dll 運算之機制,與計算機原理有著一定相關係,筆者於此不打算深入講解,
初學者只需記得一件事:dll 裡面包了許多函式,系統裡不同 dll 所提供的函式也不盡相同,
部份函式是用來與作業系統做溝通,而 AuotIt 本身可能沒辦法達成,此時就必須靠呼叫 dll 完成。

本文主要是說明如何調用 DLL 裡面的函式,
故舉的 API 較為簡單,大多被 AutoIt 另外包裝成函式;
另 AutoIt 本身沒辦法自行撰寫 dll,必須學習其他程式語言方可撰寫。


windows 底下,就我所知道的 dll 大致上有下面這幾個,想要知道更詳細的可以參考 wiki 這裡

1. kernel32.dll

很重要。主要掌控系統,包含檔案系統、裝置管理、process 與 thread、錯誤管理,早期 16-bit windows,是 krn286.exe、krn386.exe,到 32bit 後就變 kerner32.dll

2. advapi32.dll

提供增加函式到 kernel 之功能,如 windows registry;或對於一些服務之管理。

3. gdi32.dll

很重要。主要提供繪圖介面的管理 (graphics device interface)

4. user32.dll

很重要。使用者介面管理,像 button、scrollbars、keyboard、mouse 管理等。另這部份也常和 comctl32.dll 談在一起。


5. comdlg32.dll

主要就一些 dialog box ,包含 color picker、file dialog 等

6. commctrl.dll

status bars、progress bars、toolbars、tabs

7. shell32.dll

這部份名稱不一定,16bits 是 shell.dll,主要是一些 shell 工作。


貮、[A] AutoIt!! 第一個Dll (幼幼班)


[轉載][A] AutoIt!! 第一個Dll (幼幼班) < 轉自筆者 EdisonX 部落格 >

基本上 AutoIt 要調用 dll ,就一定離不開 msdn 查 api ,但對沒程式經驗或只碰過 autoit 的人可能也看不懂,先跟各位說 msdn 的  網址 ,以後會常用到。我們先來看一個簡單的 SetCursorPos ,這個函式是用來設定 mouse 位置。[code=C]
BOOL WINAPI SetCursorPos(
  __in  int X,
  __in  int Y
);
[/code]

在 MSDN 上說明這個函式的 頁面 往下拉,會發現它是 user32.dll  裡面,這個很重要, autoit 要調用 win32 api 函式前一定要先知道它放在哪個 dll 裡面。這裡要開始解說了。

1. BOOL WINAPI  SetCursorPos - 事實上那個 WINAPI 是為了避免以後相容性的問題在做的,那個就不要理它了。它的傳回值就是 BOOL;而函式名稱就是 SetCursorPos。

2. __in int X -   這裡先說明,真正的資料型態絕對不會是底線開頭,所以看到底線就跳過去。但這裡的 __in 卻是給我們重要的資訊。它是跟我說,
後面的X 是一個 「輸入性質」的變數,而那個 int 才是 X 真正的資料型態。

3. __in int Y - 上面會這個就會了,Y 的資料型態是 int ,它是輸入性質。


如果我用 C 語言去調用 SetCursorPos 的話會是這麼寫

[code=C]
SetCursorPos( (int)10 , (int)20);
[/code]

當然上面那些 int 是為了下面方便比對硬加上去的,這會把  mouse position 設到位置 (10, 20)。至於用 AutoIt 調用它的話是件簡單的事 (因為這個函式沒有難度),直接就使用 DllCall

[code=AutoIt]
$Result = DllCall("user32.dll", "BOOL", "SetCursorPos", "int", 10, "int", 20)
[/code]先把它轉得清楚一點好了


$Result = DllCall( DLL 名稱, 函式傳回值, 函式名稱,
                                 第一個資料型態, 第一個資料內容, 第二個資料型態, 第二個資料內容, ...)



這樣對著看應該清楚多了吧?接下來應該沒什麼要繼續講的。重點是那個 $Result 是幹嘛的

我們剛剛也看過 SetCursorPos 的原型了,輸入的參數有二個,在用 Dll 呼叫後,它會把裡面的參數都在存到 $Result 裡面。因為剛剛的輸入參數是 2 個 - int x, int y。所以 $Result[1] = x = 10; $Result[2] = y = 20,索引從 1 開始跳。至於 $Result[0] 本身代表我們調用的 win32 API 它的返回值。這個 $Result 很重要,對於一些其它的 API 要用它來看執行結果
,現在先知道它的用法就好。

接著看另一個比較難一點的 win32 API - MessageBox;這個函式就和  autoit  的 MsgBox 沒二樣,我們來看它的原型

[code=C]
int WINAPI MessageBox(
      __in_opt  HWND hWnd,
      __in_opt  LPCTSTR lpText,
      __in_opt  LPCTSTR lpCaption,
      __in      UINT uType
);
[/code]

嗯,這次不用說太多了,直接把結論寫出來

1. 函式名稱:MessageBox
2. 傳回值:int
3. 輸入引數型態:HWND、LPCTSTR、LPCTSTR、UINT


這裡要說明的是輸入引數部份,
HWND 是一個視窗的代號,autoit 對應它的資料型態用 "hwnd";
LPCTSTR 指的是要輸入的是一大串文字,只要是字串的東西,autoit 就用 "str" 帶過去;
UINT 代表的是無號數,它在 MessageBox 是決定那個訊息盒長怎樣,所以你可以塞給它一個數字就行了(如果要查明數字代表怎樣的訊息盒,就到 這個 頁面 查)

好了,於是我們又可以調用了,再把 autoit 的 DllCall 原型寫出來一次

$Result = DllCall( DLL 名稱, 函式傳回值, 函式名稱,
                                 第一個資料型態, 第一個資料內容, 第二個資料型態, 第二個資料內容, ...
)


代進去之後就變成

[code=AutoIt]
$result = DllCall("user32.dll", "int", "MessageBox",  _
                             "hwnd", 0, "str", "標題文字", "str", "顯示內容", "int", 0)
[/code]

接下來會有一堆問題,我怎麼知道 win32 api 哪個資料型態要對應到 autoit 哪個資料型態?
嗯,事實上 autoit 上的 manual 有列出一些了,在 C 語言裡面的一些資料型態述敘如下

類型細節內容
none(或 void)無數值 (僅作用於無返回值函數的返回類型,跟 C 語言類似)。
byte8 位元整數。
ubyte無帶符號的 8 位元整數。
short16 位元整數。
ushort無帶符號的 16 位元整數。
dword無帶符號的 32 位元整數。
udword無帶符號的 32 位元整數。
int32 位元整數。
uint無帶符號的 32 位元整數。
long32 位元整數。
ulong無帶符號的 32 位元整數。
int6464 位元整數。
uint64無帶符號的 64 位元整數。
str一個 ANSI 字串 (不能多於 65536 字元)。
wstr一個 UNICODE 寬字元文字 (當呼叫需要時須轉換 為/來自 的 ANSI 文字),不能多於 65536 字元。
hwnd視窗控制碼 (指標)。
ptr通用指標 (void *)。
float單精度浮點指標數值。
double雙精度浮點指標數值。
lresult/int_ptr/long_ptr當於 x86 或 x64 的 AutoIt 版本下執行時,大小足夠用以支援指標的整數。
lparam/int_ptr/long_ptr當於 x86 或 x64 的 AutoIt 版本下執行時,大小足夠用以支援指標的整數。
wparam/uint_ptr/ulong_ptr當於 x86 或 x64 的 AutoIt 版本下執行時,大小足夠用以支援指標的無帶符號整數。
*新增 * 符號到其它類型結尾以透過關聯傳遞。例如 "int*" 傳遞指標到某個 "int" 類型。


上面這個在 官網 上定義更清楚。而部份的替換如下

WINDOWS API 類型AutoIt 類型
LPCSTR/LPSTRstr
LPCWSTR/LPWSTRwstr
LPVOIDptr
HWNDhwnd
WPARAMwparam
LPARAMlparam
DWORDdword
LPDWORDdword*
HANDLE/HINSTANCEptr
LONGLONG/LARGE_INTEGERint64
ULONGLONG/ULARGE_INTEGERuint64
UINT_PTRwparam
LONG_PTRlparam


至於有些沒看過的,有些可以去 try-error,或是再去找找它的真正代表函意,再給它適當的對應。這篇暫時就到這。
樓主熱門主題

該用戶從未簽到

升級   36.4%

2F
發表於 2012-10-28 00:36 | 只看該作者
謝謝您!這麼詳細的回答!感激不盡!!!

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2024-4-19 12:43

Discuz! X

© 2009-2023 Microduo

快速回覆 返回頂部 返回列表