【问题标题】:how to expose variables from msscriptcontrol?如何从 msscriptcontrol 公开变量?
【发布时间】:2014-11-15 21:31:37
【问题描述】:

我现在正在尝试一段时间.. 是否可以使用 msscriptcontrol 向主脚本公开变量和其他内容?

此控件的示例:

set a = createobject("msscriptcontrol.scriptcontrol") 
a.language = "vbscript" 
a.executestatement "ab = 12" 
msgbox a.eval("ab") 

我喜欢做的是在 vb6 中制作一个 activeX com dll,以便在我的 vbscript 中包含其他脚本。 我这样做的旧方法是:读取带有 fso 对象的文件并执行全局脚本文件的内容。 现在我想把它包装成一个activeX dll。 这里有一些伪 vbscript 代码向您展示我在 dll 完成后要完成的工作:

set include = createObject("scripting.includeFile") 
include.file "c:\test.vbs" 
call sub_in_test_vbs() 

奇怪的想法? 我试图在带有 msscriptcontrol 的 vb6 类中使用包含函数来执行此操作,但它不能执行“executeGlobal” 并将脚本暴露给主 vbscript...

[编辑:Ekkehard.Horner]

Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub

【问题讨论】:

    标签: vbscript vb6


    【解决方案1】:

    如果您想以任何 COM(ic) 语言编写组件并以任何 COM(ic) 语言使用它们 - 即使没有注册 - 请使用 Windows Script Components

    更新:

    来自您的评论

    所以有时我将大脚本拆分为较小的 vbscript,把 将它们放入一个文件夹并制作一个读取所有内容的主脚本 该文件夹并执行脚本中的内容。在主文件中 是一个名为“include”的子(请参阅我的问题中的示例),以便我可以 包括文件,例如c++ 矿石。问题是 每次我这样做时,我都必须在 main vbscript 所以我想知道我是否可以在 vb6 中制作一个 activeX dll 所以 我只能这样做:createobject("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) 将 Sub 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
    

    which - 除了引用和名称错误 - 相当于 (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
    

    (参见herethought 的更多食物)

    因此,在设计 Sub include() 上付出一些努力,它可以处理包含的文件中可能出现的语法错误,避免多次加载同一个模块,并提供额外的有效负载(搜索 lib 文件夹列表,保证卸载的有序序列,进行初始化/清理,...) - 或坚持(a)。

    (3) 如果你想混合语言并使用 COM 的特性,忘记 ExecuteGlobal 并使用 .wsf 和 .wsc 文件。如果您“对 XML 一无所知并且...没有使用 wsc 文件以及如何正确注册它们的经验”,那么您将不得不了解这些奇怪的野兽,最好通过研究文档。

    【讨论】:

    • Ekkehard.Horner,我对 XML 一无所知,也没有使用 wsc 文件以及如何在 64 位笔记本电脑上正确注册它们的经验。请你帮助我好吗?我只想为 vbscript 创建一个小的“包含(文件路径)”函数,以便我可以包含其他脚本。提前致谢!我将使用要放入组件的脚本来编辑我的问题。
    【解决方案2】:

    脚本控件可以访问程序的内容,特别是对象。

    它的帮助文件应该在 system32 文件夹中,包含参考、一些基本概念信息和一些小示例。


    使脚本引擎可以使用运行时功能。

    语法

    ScriptControl.AddObject(name, object[, addMembers])
    

    AddObject 方法包含以下部分:

    部件说明

    名称 必填。 ScriptControl 代码中添加对象的名称。

    对象 必需。在运行时公开的对象的名称。

    addMembers 可选。布尔值。如果对象的成员可全局访问,则为真;如果不是,则为 false。

    备注

    使用 AddObject 方法使脚本引擎可以使用运行时功能。 AddObject 方法使 ScriptControl 用户能够为脚本代码提供一组名称/对象对。脚本引擎可以以任何方式公开名称。在 VBScript 和 JScript 中,每个名称都显示为可全局访问的名称。

    【讨论】:

    • 感谢您的快速回复:) 但我试图将代码公开给脚本本身,而不是 ScriptControl。我想在脚本控件中编写一个脚本,执行全局的一些代码,从文件到主脚本..很难解释我的意思,对不起^^
    • main vbscript:新的 ScriptControl 对象 -> 读取文件并将该文件中的内容执行到主 vbscript 的代码。
    • 回答:@noodlesstillive
    • 您将一个 VB6 类添加到它可以访问的脚本控件的宿主对象列表中。 ScriptControl.AddObject(WhatTheScriptControlCallsIt, VB6_ClassOrOtherObject, True)
    • noodlesstilllive,好的,我要试试这个,但我不知道该怎么做。我完成后回复:)
    【解决方案3】:

    这按预期工作并显示“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 的文本区域中编写的代码。

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 1970-01-01
      • 2010-11-02
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多