使用者輸入任意函數 f(x),繪製其曲線。核心難點在於運算式求值。編譯型語言需自行實作掃描、語法分析、AST 建構、逆波蘭表式轉換、堆疊運算,極其複雜。本文另闢蹊徑:動態產生腳本交由腳本引擎運算。

圖一:函數曲線繪製控件執行畫面
實作 IActiveScriptSite 介面 (8 方法):
GetLCID:語系查詢,可回 E_NOTIMPL 使用系統預設GetItemInfo:提供 ITypeInfo (型別庫) 與 IUnknown (透過 IDispatch::Invoke 呼叫擴充函數)GetDocVersionString:文件版本字串,可回 E_NOTIMPLOnScriptTerminate:腳本結束通知OnStateChange:狀態變更通知OnScriptError/OnEnterScript/OnLeaveScript:錯誤/進入/離開通知需 UI 互動時另實作 IActiveScriptSiteWindow。
實作 IDispatch 提供後繫結方法/屬性,經 GetItemInfo 傳給腳本引擎。
CoCreateInstance 建立引擎 COM 物件,取得 IActiveScriptQueryInterface 取得 IActiveScriptParseInitNew 初始化AddNamedItem 指定項目名稱 (觸發 GetItemInfo)ParseScriptText 提交腳本文字SetScriptState 開始執行Close 關閉釋放常用引擎 ProGID/CLSID:
| 引擎 | ProGID | CLSID |
|---|---|---|
| VBScript | VBScript | {B54F3741-5B07-11CF-A4B0-00AA004A55E8} |
| JScript | JScript | {F414C260-6AC0-11CF-B6D1-00AA00BBBB58} |
| XMLScript | XML | {989D1DC0-B162-11D1-B6EC-D27DDCF9A923} |
ATL ActiveX 控件同時扮演腳本宿主與自動化物件。使用者輸入 f(x),控件依視窗寬度與 X/Y 範圍迴圈產生腳本:
' 第 1 次呼叫動態產生的腳本
i = 0
x = -4.0
y = sin(x)
call Result(i, x, y)
每次迴圈更新 x、重新 ParseScriptText、執行取得 y,繪製點連線成曲線。
| 運算子 | 函數 |
|---|---|
| +, -, *, /, ^, MOD, \ | Abs, Sgn, Sqr, Int, Fix, Round |
| Log, Exp, Sin, Cos, Tan, Atn |
Result(i,x,y):回傳座標點 (自動附加於腳本末行,勿手動呼叫)Pi:3.1415926 (如 sin(x * Pi))log10():10 為底對數本文重點介紹 Windows 程式呼叫腳本引擎方法,函數曲線繪製僅為示範。腳本引擎可實作更多創意功能。