如何从msscriptcontrol中公开变量?

时间:2014-11-15 21:31:37

标签: vbscript vb6

我现在试了一会儿.. 是否可以使用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类中的include函数来做这个,但它不能做“executeGlobal” 并将脚本公开给主vbscript ...

[编辑:Ekkehard.Horner]

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

3 个答案:

答案 0 :(得分:2)

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

<强>更新

来自您的评论

  

所以有时我将大脚本分成更小的vbscript&put   将它们放入一个文件夹并创建一个主脚本来读取所有内容   该文件夹并执行脚本中的内容。在那里的主文件中   是一个名为&#34; include&#34; (参见我的问题中的例子)这样我就可以   包含例如文件中的文件c ++某种东西。问题是   每次我这样做,我必须写同样的#34;包括&#34;分在   主要的vbscript所以我想知道我是否可以在vb6中制作一个activeX dll   我只能这样做:createobject(&#34; blah.include&#34;)。include   &#34;文件路径&#34; ...

我认为您的真实世界问题是通过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

其中 - 引用&amp;抛开名称错误 - 相当于(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文件的经验以及如何正确注册它们,那么您必须学习关于这些奇怪的野兽,最好是通过研究文档。

答案 1 :(得分:1)

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

它的帮助文件应该在带有Reference的system32文件夹中,一些基本的概念信息和一些小样本。


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

<强>语法

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

AddObject方法包含以下部分:

  

部分说明

     

名称必填。在ScriptControl代码中通过其添加对象的名称。

     

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

     

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

<强>说明

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

答案 2 :(得分:0)

这可以按预期工作,并显示&#34; 12&#34;

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的文本区域中编写的代码。