並非每個專案都需要完整的腳本宿主架構。本文展示如何利用 Microsoft Script Control (ActiveX) 以最少代碼為 MFC 應用程式加入 VBScript/JScript 腳本支援。範例專案 ScriptControlMacro 同時示範單實例鎖定、二進制註冊表讀寫、視窗狀態持久化、CEditView 多字體、OLE 異常處理等實用技巧。
AppWizard 勾選「ActiveX Controls」支援。
ClassWizard → 「Add Class」→「From Type Library」選擇 Microsoft Script Control 1.0,生成 IScriptControl 派生類:
class IScriptControl : public COleDispatchDriver {
public:
void SetLanguage(LPCTSTR lpszNewValue); // "VBScript" / "JScript"
void SetSitehWnd(HWND hWnd); // 宿主視窗句柄
LPDISPATCH GetError(); // 取得錯誤物件
void AddObject(LPCTSTR Name, LPDISPATCH Obj, BOOL AddMembers); // 公開物件給腳本
void AddCode(LPCTSTR Code); // 添加腳本代碼
};
保留上述 5 個核心方法即可。
ClassWizard → 「Add Class」→「Automation」新增 CScriptControlMacroDispatch:
class CScriptControlMacroDispatch : public CCmdTarget {
DECLARE_DYNCREATE(CScriptControlMacroDispatch)
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
afx_msg void Test1(); // 範例方法
afx_msg void Test2();
};
Dispatch Map 將方法名暴露給腳本:
BEGIN_DISPATCH_MAP(CScriptControlMacroDispatch, CCmdTarget)
DISP_FUNCTION(..., "Test1", Test1, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(..., "Test2", Test2, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
IScriptControl m_scriptCtrl 與 CScriptControlMacroDispatch* m_pDispatch。OnInitialUpdate 初始化:m_scriptCtrl.CreateControl(CLSID_ScriptControl, ..., this, ...);
m_scriptCtrl.SetLanguage(_T("VBScript"));
m_scriptCtrl.SetSitehWnd(m_hWnd);
m_pDispatch = new CScriptControlMacroDispatch();
m_pDispatch->EnableAutomation();
m_scriptCtrl.AddObject(_T("Application"), m_pDispatch->GetIDispatch(TRUE), TRUE);
// 載入腳本代碼(從檔案/資源/編輯器)
m_scriptCtrl.AddCode(scriptCode);
CreateFileMapping + OpenFileMapping 檢測現有實例並激活。CWinApp::GetProfileBinary / WriteProfileBinary 存儲視窗布局、腳本代碼等 Blob 資料。WINDOWPLACEMENT 結構存入註冊表,啟動時 SetWindowPlacement 還原。OnInitialUpdate 建立 CFont 陣列,OnCtlColor 依行號切換字體。TRY/CATCH(COleException, e) 捕獲 COleDispatchException,e->m_strDescription 顯示友善錯誤。// AFX.H 修改
#ifdef _UNICODE
#pragma comment(linker, "/entry:wWinMainCRTStartup")
#endif
// AFXV_W32.H 修改
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0500 // 確保 Win2K+ API 可用
#endif

完整原始碼附於附件,可直接作為腳本擴展框架二次開發。