dBASE 並不直接認識 Win32 的 HINSTANCELPCTSTR 這些 C++ 風格的關鍵字,必須使用 dBASE 內置的數據類型關鍵字(如 CLONG, CSTRING, CPTR 等)。

請嘗試將宣告修改為以下 dBASE 標準格式

修正後的代碼

if type(“ShellExecute”) # “FP”
// 使用 CLONG 代替 HINSTANCE 和 HWND
// 使用 CSTRING 代替 LPCTSTR
// 使用 CINT 代替最後一個顯示參數
extern CLONG ShellExecute(CLONG, CSTRING, CSTRING, CSTRING, CSTRING, CINT) ;
ADVAPI32 FROM “ShellExecuteA”

/* 注意:如果上面寫 ADVAPI32 不行,請改回 SHELL32
通常在 dBASE 中建議寫完整的 dll 名稱
*/
extern CLONG ShellExecute(CLONG, CSTRING, CSTRING, CSTRING, CSTRING, CINT) ;
SHELL32 FROM “ShellExecuteA”
endif

// 呼叫測試
ShellExecute(0, “open”, “ms-settings:”, 0, 0, 1)

為什麼會報錯?(語法細節)

  1. 關鍵字不符HINSTANCEHWND 是 Windows SDK 的定義,在 dBASE 的 extern 指令中,它們都應該映射為 CLONG(長整數)。

  2. 字串類型LPCTSTR 在 dBASE 中對應的是 CSTRING(以空字元結尾的字串)。

  3. 分號的位置extern 指令如果換行,結尾必須有分號 ;

如果還是報錯,最簡單的「免宣告」方案

如果您不想處理繁瑣的 API 宣告,dBASE 2019 可以直接利用 Windows 的 COM 物件 來執行相同的功能,這樣絕對不會有型別定義錯誤的問題:

程式碼片段

// 使用 Windows Script Host 執行
local oShell
oShell = new OleAutoClient("WScript.Shell")
oShell.Run("ms-settings:display") // 直接開啟顯示設定

  extern CLONG ShellExecute(CLONG, CSTRING, CSTRING, CSTRING, CSTRING, CINT) SHELL32 FROM “ShellExecuteA” 這行可以

太棒了!這代表你的 dBASE Plus 2019 已經成功與 Windows API 對接上了。

之所以這行可以,是因為你使用了 CLONG 和 CSTRING 這些 dBASE 內置的標準型別關鍵字,這才是它能聽懂的語言。

既然這行已經成功宣告,你可以直接在你的程式碼(例如按鈕的 onClick 事件)中加入以下指令來跳轉到不同的 Windows 設定 畫面:

常用跳轉指令範例

程式碼片段

// 1. 開啟「設定」主頁面
ShellExecute(0, "open", "ms-settings:", 0, 0, 1)

// 2. 開啟「顯示器」設定 (調整解析度、縮放)
ShellExecute(0, "open", "ms-settings:display", 0, 0, 1)

// 3. 開啟「網路和網際網路」 (檢查 IP 或 Wi-Fi)
ShellExecute(0, "open", "ms-settings:network", 0, 0, 1)

// 4. 開啟「Windows 更新」
ShellExecute(0, "open", "ms-settings:windowsupdate", 0, 0, 1)

// 5. 開啟「關於」頁面 (查看系統版本)
ShellExecute(0, "open", "ms-settings:about", 0, 0, 1)

注意事項與技巧
  • 開啟網頁:你也可以用它來開網頁,例如 ShellExecute(0, "open", "https://www.google.com", 0, 0, 1)

  • 開啟檔案:如果給它一個檔案路徑(如 .pdf.xlsx),它會自動呼叫對應的程式開啟。

  • 權限:有些特殊的設定頁面可能需要管理員權限,但一般 ms-settings 協議都是可以直接運行的。

進階應用:選擇資料夾

既然你已經學會了 extern,如果你之後需要讓使用者選擇資料夾,通常會用到 SHELL32 裡的另一個函數 SHBrowseForFolder。那部分的宣告會比較複雜(需要用到結構體),如果你有需要,隨時跟我說!

個人頭像照片

By 伍 芳左

MIS, ERP Pro...

發佈留言