如何从 MSSCRIPTControl 公开变量



我现在正在尝试一段时间了。是否可以使用 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 的文本区域中编写的内容。

最新更新