Object 如何制作一个;包括「;vb6中用于vbscript的activeX对象?

Object 如何制作一个;包括「;vb6中用于vbscript的activeX对象?,object,vbscript,vb6,activex,Object,Vbscript,Vb6,Activex,这就是我想做的: VB6 com.dll,名称和类名:scripting.includefile sub include(filepath) ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME, 1).READALL & vbNewLine) End Sub filter vbs "uf=StrReverse^(L^)"<"%systemroot%\win.ini" vb

这就是我想做的:

VB6 com.dll,名称和类名:scripting.includefile

sub include(filepath)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME, 1).READALL & vbNewLine)
End Sub
filter vbs "uf=StrReverse^(L^)"<"%systemroot%\win.ini"
vbscript:

set x = createobject("scripting.includefile")
x.include "c:\test.vbs"
call sub_inside_test_vbs
这可能吗?
提前感谢:)

您只需读取一个文件并将文本分配给脚本控件即可

这是vbscript,但vbscript是合法的VB6

在这里,我从命令行读取一个脚本,并将其应用于stdin的每一行。注意:我使用脚本控件检查语法错误(与运行时错误不同,语法错误后不能继续程序)。我实际上是在vbscript中执行脚本(VB6无法执行),而不是使用脚本控件来简化数据传递

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout

RawScript = Arg(1)
'Remove ^ from quoting command line and replace : with vbcrlf so get line number if error
Script = Replace(RawScript, "^", "")
Script = Replace(Script, "'", chr(34))
Script = Replace(Script, ":", vbcrlf)
'Building the script with predefined statements and the user's code
Script = "Dim gU" & vbcrlf & "Dim gdU" & vbcrlf & "Set gdU = CreateObject(" & chr(34) & "Scripting.Dictionary" & chr(34) & ")" & vbcrlf & "Function UF(L, LC)" & vbcrlf & "Set greU = New RegExp" & vbcrlf & "On Error Resume Next" & vbcrlf & Script & vbcrlf & "End Function" & vbcrlf

'Testing the script for syntax errors
On Error Resume Next
set ScriptControl1 = wscript.createObject("MSScriptControl.ScriptControl",SC)
    With ScriptControl1
        .Language = "VBScript"
        .UseSafeSubset = False
        .AllowUI = True
    .AddCode Script
End With
With ScriptControl1.Error
    If .number <> 0 then
        Outp.WriteBlankLines(1)
        Outp.WriteLine "User function syntax error"
        Outp.WriteLine "=========================="
        Outp.WriteBlankLines(1)
        Outp.Write NumberScript(Script)
        Outp.WriteBlankLines(2)
        Outp.WriteLine "Error " & .number & " " & .description
        Outp.WriteLine "Line " & .line & " " & "Col " & .column
        Exit Sub
    End If
End With

ExecuteGlobal(Script)

'Remove the first line as the parameters are the first line
'Line=Inp.readline  
Do Until Inp.AtEndOfStream
    Line=Inp.readline
    LineCount = Inp.Line 

    temp = UF(Line, LineCount)
    If err.number <> 0 then 
        outp.writeline ""
        outp.writeline ""
        outp.writeline "User function runtime error"
        outp.writeline "==========================="
        Outp.WriteBlankLines(1)
        Outp.Write NumberScript(Script)
        Outp.WriteBlankLines(2)
        Outp.WriteLine "Error " & err.number & " " & err.description
        Outp.WriteLine "Source " & err.source

        Outp.WriteLine "Line number and column not available for runtime errors"
        wscript.quit
    End If
    outp.writeline temp
Loop
End Sub
使用冒号分隔语句和行。使用单引号代替双引号,如果需要单引号,请使用chr(39)。带^字符的转义括号和符号。如果您需要插入符号,请使用chr(136)

该函数称为UF(用于UserFunction)。它有两个参数,L包含当前行,LC包含行数。将脚本的结果设置为UF。参见示例

有三个全局对象可用。用于维护状态的未声明全局变量gU。如果需要多个变量,请将其用作数组。用于保存和访问前几行的字典对象gdU。和一个可供使用的RegExp对象greU

示例

sub include(filepath)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME, 1).READALL & vbNewLine)
End Sub
filter vbs "uf=StrReverse^(L^)"<"%systemroot%\win.ini"
此vbs脚本插入行号并将行设置为过滤器打印的函数UF

filter vbs "uf=LC ^& ' ' ^& L"<"%systemroot%\win.ini"
如果出现语法错误,筛选器将显示调试详细信息

用户函数语法错误 用户函数运行时错误 其他示例

每行倒转一次

sub include(filepath)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME, 1).READALL & vbNewLine)
End Sub
filter vbs "uf=StrReverse^(L^)"<"%systemroot%\win.ini"

filter vbs“uf=StrReverse^(L^)”如果问题的关键是将外部脚本文件包含到WSH脚本中,那么您可以简单地停止将脚本作为裸vbs文件编写,而改为编写WSF

假设这两个文件位于同一文件夹中:

Utilities.vbs(这里我们只定义一个子项作为演示)

DemoScript.wsf

<job>
<script language="VBScript" src="Utilities.vbs"/>
<script language="VBScript">
Option Explicit

Private AA
Private I
Private Msg

AA = Array(Array("Joe", "Rockhead", "56 Boulder Street"), _
           Array("Barney", "Rubble", "125 Rockaway Lane"), _
           Array("Fred", "Flintstone", "123 Rockaway Lane") _
          )
BubbleSort AA, 1, False
Msg = vbNullString
For I = LBound(AA) To UBound(AA)
    Msg = Msg & Join(AA(I), ", ") & vbNewLine
Next
WScript.Echo Msg
</script>
</job>

选项显式
私人机管局
一等兵
私人味精
AA=阵列(阵列(“乔”、“岩石头”、“博尔德街56号”)_
阵列(“巴尼”、“瓦砾”、“洛克韦巷125号”)_
阵列(“弗雷德”、“燧石”、“洛克韦巷123号”)_
)
BubbleSort AA,1,错误
Msg=vbNullString
对于I=LBound(AA)至UBound(AA)
Msg=Msg&Join(AA(I),“,”)&vbNewLine
下一个
Echo Msg

noodlesstillalive,“我实际上在vbscript中执行脚本(VB6无法执行)”,这就是我所需要知道的一切:),因此在VB6中是不可能的。我想制作一个简单的activeX dll,使executeglobal成为vbscript中的一个文件,首先我想“也许在vb6类中使用scriptcontrol是可能的”,但正如您所看到的那样,这也是不可能的。我想与其说实现,不如说实现,不如说你想要什么。忘记语言等,只需解释最终状态和它的要求。我有一个scriptcontrol,它在VB6字处理器中提供vbscript宏。如果我共享一个VB6窗体(窗体是一个对象),vbscript宏可以访问该窗体上的所有函数。如果我理解正确,请首先询问我为什么要这样做,或者为什么要这样做?我一直在写vbscript,有时候代码非常大,所以有时候我把大的脚本分成更小的vbscript,把它们放在一个文件夹中,制作一个主脚本,读取文件夹中的所有内容并执行脚本中的内容。在主文件中有一个子名为“包含”(参见我的问题中的示例),这样我就可以包含像C++之类的文件。问题是,每次我这样做时,我都必须在主vbscript中编写相同的“include”子脚本,因此我想知道是否可以在vb6中创建activeX dll,以便我可以这样做:createobject(“blah.include”)。include“filepath”…这些是我们正在讨论的内容的参考。将命令添加到vbscript的程序员。同一个人在jscript的第1部分(共3部分)中谈论eval。cf
ExecuteGlobal
是一条语句,它不是VB6代码可以访问的对象的方法。唯一的选择是将
include
函数实现保留在VBScript中。有趣的想法是,我必须开始学习XML,我想,感谢BOB77,所需的XML非常少,并且在WSH文档中有很好的文档记录。作为奖励,您可以使用它来实例化对象(FSO等)以及引用类型库以将常量导入脚本的命名空间。看见
<job>
<script language="VBScript" src="Utilities.vbs"/>
<script language="VBScript">
Option Explicit

Private AA
Private I
Private Msg

AA = Array(Array("Joe", "Rockhead", "56 Boulder Street"), _
           Array("Barney", "Rubble", "125 Rockaway Lane"), _
           Array("Fred", "Flintstone", "123 Rockaway Lane") _
          )
BubbleSort AA, 1, False
Msg = vbNullString
For I = LBound(AA) To UBound(AA)
    Msg = Msg & Join(AA(I), ", ") & vbNewLine
Next
WScript.Echo Msg
</script>
</job>