首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

為 MFC 應用程式輕量級整合腳本引擎:基於 Microsoft Script Control 實作

     編輯:關於VC++

並非每個專案都需要完整的腳本宿主架構。本文展示如何利用 Microsoft Script Control (ActiveX) 以最少代碼為 MFC 應用程式加入 VBScript/JScript 腳本支援。範例專案 ScriptControlMacro 同時示範單實例鎖定、二進制註冊表讀寫、視窗狀態持久化、CEditView 多字體、OLE 異常處理等實用技巧。

前置需求

  • 熟悉 COM、ActiveX 控件、OLE 自動化基礎。
  • 已安裝 Microsoft Script Control(隨 IE/Office 安裝或單獨下載)。

核心實作步驟

1. 建立支援 ActiveX 的 MFC 專案

AppWizard 勾選「ActiveX Controls」支援。

2. 從類型庫生成 Script Control 包裝類

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);                  // 添加腳本代碼
};

3. 精簡包裝類,移除無用方法

保留上述 5 個核心方法即可。

4. 建立自動化類別供腳本呼叫

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()

5. 整合到視圖類別

  • 視圖類別持有 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 還原。
  • CEditView 多字體:OnInitialUpdate 建立 CFont 陣列,OnCtlColor 依行號切換字體。
  • OLE 異常處理:TRY/CATCH(COleException, e) 捕獲 COleDispatchException,e->m_strDescription 顯示友善錯誤。

專案級 Unicode 相容性定製

// AFX.H 修改
#ifdef _UNICODE
#pragma comment(linker, "/entry:wWinMainCRTStartup")
#endif

// AFXV_W32.H 修改
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0500  // 確保 Win2K+ API 可用
#endif

運行效果

腳本控制台運行截圖

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved