在C++、C#、VB6、Delphi语言中嵌入MSScriptControl.ScriptControl

多语言嵌入MSScriptControl实践

下面为在C++、C#、VB6、Delphi中嵌入MSScriptControl.ScriptControl并执行脚本代码的实例:

🔧 C++ 示例 (使用MSScriptControl)

#include <windows.h>
#include <oaidl.h>
#include <ocidl.h>

// 使用MSScriptControl执行VBScript
BOOL ExecuteVBScript()
{
    CLSID clsid;
    HRESULT hr;
    IDispatch* pScriptControl = NULL;
    
    // 创建ScriptControl对象
    hr = CLSIDFromProgID(L"MSScriptControl.ScriptControl", &clsid);
    if (FAILED(hr)) return FALSE;
    
    hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&pScriptControl);
    if (FAILED(hr)) return FALSE;
    
    // 设置语言属性
    DISPID dispid;
    OLECHAR* languageProp = L"Language";
    hr = pScriptControl->GetIDsOfNames(IID_NULL, &languageProp, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
    
    VARIANT varLang;
    varLang.vt = VT_BSTR;
    varLang.bstrVal = SysAllocString(L"VBScript");
    
    DISPPARAMS dp = { &varLang, NULL, 1, 0 };
    hr = pScriptControl->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
    
    // 执行脚本
    OLECHAR* evalMethod = L"Eval";
    hr = pScriptControl->GetIDsOfNames(IID_NULL, &evalMethod, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
    
    VARIANT varScript;
    varScript.vt = VT_BSTR;
    varScript.bstrVal = SysAllocString(L"2 + 3 * 5");
    
    DISPPARAMS dpEval = { &varScript, NULL, 1, 0 };
    VARIANT result;
    hr = pScriptControl->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dpEval, &result, NULL, NULL);
    
    if (SUCCEEDED(hr) && result.vt == VT_I4) {
        printf("计算结果: %d\n", result.intVal);
    }
    
    // 清理资源
    VariantClear(&varLang);
    VariantClear(&varScript);
    pScriptControl->Release();
    CoUninitialize();
    
    return TRUE;
}

🔧 C# 示例 (添加COM引用MSScriptControl)

using System;
using MSScriptControl;

class ScriptExample
{
    static void Main()
    {
        // 创建ScriptControl对象
        ScriptControl sc = new ScriptControl();
        
        // 执行VBScript
        Console.WriteLine("=== VBScript 示例 ===");
        sc.Language = "VBScript";
        
        // 添加变量和函数
        sc.Execute("x = 10\ny = 20");
        object result1 = sc.Eval("x + y");
        Console.WriteLine($"VBScript计算结果: {result1}");
        
        // 执行复杂脚本
        string vbCode = @"
            Function CalculateArea(radius)
                CalculateArea = 3.14159 * radius * radius
            End Function
            
            Function Greet(name)
                Greet = ""Hello, "" & name & ""!""
            End Function
        ";
        
        sc.Execute(vbCode);
        object area = sc.Eval("CalculateArea(5)");
        object greeting = sc.Eval("Greet(""World"")");
        Console.WriteLine($"圆面积: {area}");
        Console.WriteLine($"问候语: {greeting}");
        
        // 执行JScript (JavaScript)
        Console.WriteLine("\n=== JScript 示例 ===");
        sc.Language = "JScript";
        
        string jsCode = @"
            function factorial(n) {
                if (n <= 1) return 1;
                return n * factorial(n - 1);
            }
            
            var message = 'JScript计算完成';
        ";
        
        sc.Execute(jsCode);
        object jsResult = sc.Eval("factorial(5)");
        object jsMessage = sc.Eval("message");
        Console.WriteLine($"5的阶乘: {jsResult}");
        Console.WriteLine($"消息: {jsMessage}");
        
        // 错误处理
        try
        {
            sc.Execute("invalid code here;;;");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"脚本错误: {ex.Message}");
        }
    }
}

🔧 VB6 示例

Option Explicit

Private Sub ExecuteScriptExample()
    Dim sc As Object
    Dim result As Variant
    
    On Error GoTo ErrorHandler
    
    ' 创建ScriptControl对象
    Set sc = CreateObject("MSScriptControl.ScriptControl")
    
    ' VBScript 示例
    sc.Language = "VBScript"
    
    ' 执行简单计算
    result = sc.Eval("2 + 3 * 4")
    MsgBox "VBScript计算结果: " & CStr(result)
    
    ' 执行多行脚本
    sc.Execute "
        Dim userName
        userName = ""VB6用户""
        Function GetWelcomeMessage()
            GetWelcomeMessage = ""欢迎 "" & userName
        End Function
    "
    
    result = sc.Eval("GetWelcomeMessage()")
    MsgBox "函数调用结果: " & CStr(result)
    
    ' JScript 示例
    sc.Language = "JScript"
    
    sc.Execute "
        function multiply(a, b) {
            return a * b;
        }
        var jsVar = '来自JScript的变量';
    "
    
    result = sc.Eval("multiply(7, 8)")
    MsgBox "JScript乘法结果: " & CStr(result)
    
    result = sc.Eval("jsVar")
    MsgBox "JScript变量: " & CStr(result)
    
    Exit Sub
    
ErrorHandler:
    MsgBox "脚本执行错误: " & Err.Description
End Sub

' 在窗体按钮点击事件中调用
Private Sub Command1_Click()
    ExecuteScriptExample
End Sub

🔧 Delphi 6 示例

unit ScriptUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  ScriptControl: Variant;
  Result: Variant;
begin
  try
    // 创建ScriptControl对象
    ScriptControl := CreateOleObject('MSScriptControl.ScriptControl');
    
    // VBScript 示例
    ScriptControl.Language := 'VBScript';
    
    // 执行简单表达式
    Result := ScriptControl.Eval('5 * 8 + 3');
    ShowMessage('VBScript计算结果: ' + VarToStr(Result));
    
    // 执行多行VBScript代码
    ScriptControl.Execute(
      'Function CalculateDiscount(price, discount)' + #13#10 +
      '    CalculateDiscount = price * (1 - discount/100)' + #13#10 +
      'End Function' + #13#10 +
      '' + #13#10 +
      'userName = "Delphi用户"'
    );
    
    Result := ScriptControl.Eval('CalculateDiscount(1000, 20)');
    ShowMessage('折扣计算: ' + VarToStr(Result));
    
    Result := ScriptControl.Eval('userName');
    ShowMessage('用户名: ' + VarToStr(Result));
    
    // JScript 示例
    ScriptControl.Language := 'JScript';
    
    ScriptControl.Execute(
      'function findMax(arr) {' + #13#10 +
      '    var max = arr[0];' + #13#10 +
      '    for (var i = 1; i < arr.length; i++) {' + #13#10 +
      '        if (arr[i] > max) max = arr[i];' + #13#10 +
      '    }' + #13#10 +
      '    return max;' + #13#10 +
      '}' + #13#10 +
      '' + #13#10 +
      'var numbers = [12, 45, 23, 67, 34, 89, 21];'
    );
    
    Result := ScriptControl.Eval('findMax(numbers)');
    ShowMessage('JScript找最大值: ' + VarToStr(Result));
    
  except
    on E: Exception do
      ShowMessage('脚本执行错误: ' + E.Message);
  end;
end;

end.

📝 使用要点说明

  1. 引用要求

    • C#:需要添加对"MSScriptControl"的COM引用
    • VB6:需要确保系统已注册MSScriptControl
    • Delphi:使用ComObj单元
  2. 主要方法

    • Eval(): 执行表达式并返回结果
    • Execute(): 执行脚本代码(不返回值)
    • Language: 设置脚本语言(“VBScript"或"JScript”)
  3. 错误处理:所有示例都包含了基本的错误处理机制

  4. 应用场景:适用于需要动态执行脚本、公式计算、业务规则配置等场景

这些示例展示了如何在不同的编程语言中嵌入和执行VBScript/JScript代码,可以根据实际需求进行调整和扩展。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千江明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值