我现在试了一会儿.. 是否可以使用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
答案 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
因此,在设计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的文本区域中编写的代码。