- 積分
- 163
- 最後登入
- 1970-1-1
- 閱讀權限
- 50
- 積分
- 163
- 帖子
- 精華
升級
100%
|
本帖最後由 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 語言類似)。 | byte | 8 位元整數。 | ubyte | 無帶符號的 8 位元整數。 | short | 16 位元整數。 | ushort | 無帶符號的 16 位元整數。 | dword | 無帶符號的 32 位元整數。 | udword | 無帶符號的 32 位元整數。 | int | 32 位元整數。 | uint | 無帶符號的 32 位元整數。 | long | 32 位元整數。 | ulong | 無帶符號的 32 位元整數。 | int64 | 64 位元整數。 | 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/LPSTR | str | LPCWSTR/LPWSTR | wstr | LPVOID | ptr | HWND | hwnd | WPARAM | wparam | LPARAM | lparam | DWORD | dword | LPDWORD | dword* | HANDLE/HINSTANCE | ptr | LONGLONG/LARGE_INTEGER | int64 | ULONGLONG/ULARGE_INTEGER | uint64 | UINT_PTR | wparam | LONG_PTR | lparam |
至於有些沒看過的,有些可以去 try-error,或是再去找找它的真正代表函意,再給它適當的對應。這篇暫時就到這。 |
|