首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何公开msscriptcontrol中的变量?

如何公开msscriptcontrol中的变量?
EN

Stack Overflow用户
提问于 2014-11-15 21:31:37
回答 3查看 3.7K关注 0票数 1

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

此控件的示例:

代码语言:javascript
复制
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完成时我想要完成的任务:

代码语言:javascript
复制
set include = createObject("scripting.includeFile") 
include.file "c:\test.vbs" 
call sub_in_test_vbs() 

anny的想法?我试图用带有msscriptcontrol的vb6类中的一个包含函数来完成这个任务,但是它不能执行"executeGlobal“操作,不能将脚本公开给主要的vbscript.

编辑for: Ekkehard.Horner

代码语言:javascript
复制
Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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)使用类似的东西

代码语言:javascript
复制
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)添加一些行,如

代码语言:javascript
复制
ExecuteGlobal goFS.OpenTextFile( gsLibDir & "XmlLib.vbs" ).ReadAll()

或(b)将子include(suitableparms)放入BaseLib.vbs中,并将其称为

代码语言:javascript
复制
includeLibs Array(                 _
           "§LibDir§ReLib.vbs"     _
         , "§LibDir§TxtManLib.vbs" _
         , "§LibDir§ADOConst.vbs"  _
         , "§LibDir§ADOLib.vbs"    _
         , "§LibDir§WMILib.vbs"    _
         , "§LibDir§DNLib.vbs"     _
         , "§LibDir§XPLLib.vbs"    _
                 )

当然,这样的Sub应该提供比

代码语言:javascript
复制
Sub Include(File)
  ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub

除引号和名称错误外,哪项与(a)相等于(A)与呼叫的额外开销。就像无用/臃肿一样

代码语言:javascript
复制
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文件的经验,以及如何正确注册它们”,那么您必须通过学习有关这些奇怪的东西,最好是通过学习这些文档。

票数 2
EN

Stack Overflow用户

发布于 2014-11-15 21:46:26

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

它的帮助文件应该在system32文件夹中提供参考,一些基本的概念信息,和一些小样本。

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

语法

代码语言:javascript
复制
ScriptControl.AddObject(name, object[, addMembers])

AddObject方法有以下几个部分:

零件描述 所需姓名。在ScriptControl代码中使用添加的对象的名称。 对象所需。在运行时公开的对象的名称。 addMembers可选。布尔值如果对象的成员是全局可访问的,则为True;如果不是,则为False。

备注

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-16 12:13:45

这符合预期,并显示"12“。

代码语言:javascript
复制
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的实际代码,而不是在堆栈溢出的文本区域中编写的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26950948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档