我现在正在尝试一段时间了。是否可以使用 MSCrScriptControl 将变量和其他内容公开给主脚本?
此控件的示例:
set a = createobject("msscriptcontrol.scriptcontrol")
a.language = "vbscript"
a.executestatement "ab = 12"
msgbox a.eval("ab")
我喜欢做的是在VB6中制作一个activeX com dll,以便在我的VBcript中包含其他脚本。我这样做的旧方法是:读取带有 FSO 对象的文件并全局执行脚本文件的内容。现在我想把它包装到一个activeX dll中。这里有一些伪VBSCRIPT代码向您展示了DLL完成后我想要完成的任务:
set include = createObject("scripting.includeFile")
include.file "c:test.vbs"
call sub_in_test_vbs()
安妮的想法?我试图在带有msscriptcontrol的vb6类中使用包含函数来执行此操作,但它无法执行"executeGlobal"并将脚本公开给主 VBcript...
[编辑:埃克哈德·霍纳]
Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub
如果要用任何 COM(ic) 语言编写 COMponent,并以任何 COM(ic) 语言使用它们 - 即使没有注册 - 请使用 Windows 脚本组件。
更新:
从您的评论
所以有时我会将大脚本拆分为较小的 VBcript,把 将它们放入一个文件夹中,并制作一个主脚本来读取所有内容 该文件夹并执行脚本中的内容。在主文件中有 是一个名为"include"的子(请参阅我问题中的示例),以便我可以 包括像 C++ 或某些东西这样的文件。问题是 每次我这样做时,我都必须在 主 vbscript 所以我想知道我是否可以在 vb6 中制作一个 activeX dll,所以 我只能这样做:createobject("blah.include").include "文件路径"...
我假设您的现实世界问题是通过 VBScript 中的模块/库重用代码。这可以在没有MS ScriptControl,vb6和dlls开销的情况下实现。
(1)使用类似的东西
Dim gsLibDir : gsLibDir = "M:libkurs0705"
Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" )
ExecuteGlobal goFS.OpenTextFile( gsLibDir & "BaseLib.vbs" ).ReadAll()
如果您所有可重用的代码都在 BaseLib.vbs 中(如果您没有将代码分发到该文件夹中的许多较小文件中,只是为了从那里"读取所有内容"的权限),那么您就完成了。
(2)如果你有一些专门的库(数据库,XML,MS Office自动化,Libre Office自动化,...),并且想根据你的main.vbs的任务从该集合中进行选择,(a) 添加几行,例如
ExecuteGlobal goFS.OpenTextFile( gsLibDir & "XmlLib.vbs" ).ReadAll()
或者(b)将子include(suitableparms)
放入BaseLib.vbs并像这样调用
includeLibs Array( _
"§LibDir§ReLib.vbs" _
, "§LibDir§TxtManLib.vbs" _
, "§LibDir§ADOConst.vbs" _
, "§LibDir§ADOLib.vbs" _
, "§LibDir§WMILib.vbs" _
, "§LibDir§DNLib.vbs" _
, "§LibDir§XPLLib.vbs" _
)
当然,这样的 Sub 应该提供比
Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub
其中 - 引用和名称错误除外 - 等同于(a)具有呼叫的额外开销。就像无用/臃肿一样
sub includeFile (fSpec)
dim fileSys, file, fileData
set fileSys = createObject ("Scripting.FileSystemObject")
set file = fileSys.openTextFile (fSpec)
fileData = file.readAll ()
file.close
executeGlobal fileData
set file = nothing
set fileSys = nothing
end sub
(参见此处,进一步思考)
因此,在设计Sub include()
时要付出一些努力,该可以处理所包含文件中可能的语法错误,避免多次加载同一模块,并提供额外的有效负载(搜索lib文件夹列表,保证有序的卸载顺序,执行初始化/清理,...) - 或坚持使用(a)。
(3)如果要混合语言并使用COM的功能,请忘记ExecuteGlobal并使用.wsf和.wsc文件。如果你对XML一无所知,并且...没有WSC文件以及如何正确注册它们的经验",那么您必须了解这些奇怪的野兽,最好通过研究文档。
脚本控件可以访问程序的内容,特别是对象。
它的帮助文件应该在 system32 文件夹中,其中包含参考、一些基本概念信息和一些小示例。
<小时 />使运行时功能可用于脚本引擎。
语法
ScriptControl.AddObject(name, object[, addMembers])
方法包含以下部分:
零件描述
名称 必填。在脚本控件代码中已知添加的对象的名称。
对象为必需。运行时公开的对象的名称。
添加成员 可选。布尔值。如果对象的成员可全局访问,则为 True;如果不是,则为假。
言论
使用 AddObject 方法使运行时功能可用于脚本引擎。AddObject 方法使脚本控件用户能够向脚本代码提供一组名称/对象对。脚本引擎可以以任何方式公开名称。在 VBScript 和 JScript 中,每个名称都显示为全局可访问的名称。
这按预期工作并显示"12"
Option Explicit
Private m_ab As Variant
Property Let ab(Value As Variant)
m_ab = Value
End Property
Property Set ab(Value As Variant)
Set m_ab = Value
End Property
Private Sub Form_Load()
With CreateObject("MSScriptControl.ScriptControl")
.Language = "VBScript"
.AddObject "__global__", Me, True
.ExecuteStatement "ab = 12"
End With
MsgBox m_ab
End Sub
请注意,这是来自 VB6 IDE 的实际代码,而不是在 stackoverflow 的文本区域中编写的内容。