下面为在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.
📝 使用要点说明
-
引用要求:
- C#:需要添加对"MSScriptControl"的COM引用
- VB6:需要确保系统已注册MSScriptControl
- Delphi:使用ComObj单元
-
主要方法:
Eval(): 执行表达式并返回结果Execute(): 执行脚本代码(不返回值)Language: 设置脚本语言(“VBScript"或"JScript”)
-
错误处理:所有示例都包含了基本的错误处理机制
-
应用场景:适用于需要动态执行脚本、公式计算、业务规则配置等场景
这些示例展示了如何在不同的编程语言中嵌入和执行VBScript/JScript代码,可以根据实际需求进行调整和扩展。
多语言嵌入MSScriptControl实践
459

被折叠的 条评论
为什么被折叠?



