關於 win32 API 裡面,有些參數是把結果存在裡面,這個我們之前有提到。現在介紹的是 GetCurrentDirectory 這個函式,它的原型如下

DWORD WINAPI GetCurrentDirectory(
  __in   DWORD nBufferLength, // 指定給多少長度存 「現在路徑」
  __out  LPTSTR lpBuffer // 調用後,「現在路徑」就存在這個變數裡面。
);

還記得之前說過的嗎?我們在調用 autoit 調用 DLL 的時候,記得用 $Result 去接它的結果,$Result[0] 是 GetCurrentDirectory 的傳回值,據 MSDN 表示,這個 API 是放在 kennel32.dll 裡面,傳回值就是「傳回字串的字串長度」;而 $Result[1] 就是第一個參數,也就是我們當初設給它的 nBufferLength;至於 $Result[2] 便是我們要的結果,也就是現在的路徑。範例碼如下所示

#cs
DWORD WINAPI GetCurrentDirectory(
  __in   DWORD nBufferLength,
  __out  LPTSTR lpBuffer
);
#ce

; 假設程式是放在 D:\ 底下
Dim $Buffer
$Result = DllCall("Kernel32.dll", "DWORD", "GetCurrentDirectory", "DWORD", 256, "str", $Buffer)
MsgBox(0, "", $Result[0])
; 傳回路徑的字數, D:\ 共3個字,所以是 3
MsgBox(0, "", $Result[1]) 
; 傳回 256,這個參數當初是自己設的
MsgBox(0, "", $Result[2])
; 傳回路徑名,也就是 D:\
MsgBox(0, "", $Buffer)  ; 這個 $Buffer 不會放路徑名,會是空的。一定要用  $Result[2] 去取得

這裡要注意一點,這個程式執行完後, $Buffer 裡面並不會放路徑名,它是一個空的東西,還是必須用 $Result[2] 去取得第二個參數的內容。

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()