我尝试了一段时间..。是否可以使用msscriptcontrol向主脚本公开变量和其他内容?
此控件的示例:
set a = createobject("msscriptcontrol.scriptcontrol")
a.language = "vbscript"
a.executestatement "ab = 12"
msgbox a.eval("ab") 我喜欢做的是在activeX中创建一个vb6 com dll,以便在vbscript中包含其他脚本。我以前这样做的方式是:读取一个带有fso对象的文件,并执行脚本文件的内容。现在我想把它包装成一个activeX动态链接库。这里有一些伪vbscript代码,向您展示当dll完成时我想要完成的任务:
set include = createObject("scripting.includeFile")
include.file "c:\test.vbs"
call sub_in_test_vbs() anny的想法?我试图用带有msscriptcontrol的vb6类中的一个包含函数来完成这个任务,但是它不能执行"executeGlobal“操作,不能将脚本公开给主要的vbscript.
编辑for: Ekkehard.Horner
Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub发布于 2014-11-15 22:12:44
如果您想用任何COM(ic)语言编写COMponents并使用任何COM(ic)语言--即使没有注册--那么就使用Windows脚本组件。
更新:
从你的评论
因此,有时我将大型脚本拆分为较小的vbscript,将它们放入文件夹中,并生成一个主脚本,读取该文件夹中的所有内容,并执行脚本中的内容。在主文件中有一个名为" include“(见我问题中的示例)的子文件,这样我就可以包含类似于例如c++、ore之类的文件。问题是,每次我这样做,我必须写同样的“包括”在主要的vbscript,所以我想我是否可以在activeX dll的vb6,以便我只需要这样做:创建对象(“blah.include”).include“文件”.
我假设您的实际问题是通过VBScript中的模块/库重用代码。这可以在不需要MS ScriptControl、vb6和dll开销的情况下实现。
(1)使用类似的东西
Dim gsLibDir : gsLibDir = "M:\lib\kurs0705\"
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)相等于(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(请参阅这里,思想的进一步食物)
因此,在设计一个处理所包含的文件中可能出现的语法错误,避免多次加载同一个模块,并提供额外的有效负载(搜索库文件夹列表、维护有序的卸载顺序、进行初始化/清理、.)--或者坚持(a)。
(3)如果您想要混合语言并使用COM的特性,就不要使用ExecuteGlobal,而要使用.wsf和.wsc文件。如果您“对XML一无所知,并且.没有使用wsc文件的经验,以及如何正确注册它们”,那么您必须通过学习有关这些奇怪的东西,最好是通过学习这些文档。
发布于 2014-11-15 21:46:26
脚本控件可以访问程序的内容,特别是对象。
它的帮助文件应该在system32文件夹中提供参考,一些基本的概念信息,和一些小样本。
使运行时功能可用于脚本引擎。
语法
ScriptControl.AddObject(name, object[, addMembers])AddObject方法有以下几个部分:
零件描述 所需姓名。在ScriptControl代码中使用添加的对象的名称。 对象所需。在运行时公开的对象的名称。 addMembers可选。布尔值如果对象的成员是全局可访问的,则为True;如果不是,则为False。
备注
使用AddObject方法使脚本引擎可以使用运行时功能。AddObject方法使ScriptControl用户能够向脚本代码提供一组名称/对象对。脚本引擎可以以任何方式公开名称。在VBScript和JScript中,每个名称都显示为一个全局访问的名称。
发布于 2014-11-16 12:13:45
这符合预期,并显示"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的实际代码,而不是在堆栈溢出的文本区域中编写的代码。
https://stackoverflow.com/questions/26950948
复制相似问题