vbs与其他语言进行交互编程(外存传参)

Posted TQCAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vbs与其他语言进行交互编程(外存传参)相关的知识,希望对你有一定的参考价值。

vbs没有自定义排序函数。无需自己造轮子,可以用其他语言来完成这个任务(在传递数据比较简单的情况下,例如只传递数组)。

首先用5分钟写一个C++排序的代码。命名为“mysort.cpp”:

#include<bits/stdc++.h>

using namespace std;

int main(int argc,char * argv[]){
    freopen("val.txt","w",stdout) ;    //重定向输出 
    vector<int> v;
    int t;
    for(int i=1;i<argc;i++){    //从命令行参数中获取变量 
        sscanf(argv[i],"%d",&t);
        v.push_back(t);
    }
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++){
        printf("%d ",v[i]);
    }
    return 0;
}

编译并测试之后,开始编写vbs代码。

这里借用昨天编写的vbs的vector类:

class Vector
    Private length
    public data()
    Sub Class_Initialize()
        length=0
    End Sub
    \'插入元素\'
    public Function Add (byval x)
        length=length+1
        redim preserve data(length-1)
        data(length-1)=x
    End Function
    \'快速展示\'
    public Function display()
        dim i
        dim s
        for i=0 to length-1
            s=s & cstr(data(i)) & " "
        next
        msgbox s
    End Function
    \'返回大小\'
    public Function size()
        size= length
    End Function
    \'获取元素\'
    public Function getAt (byval pos)
        if pos<0 or pos>length-1 then 
            getAt=0
            exit Function
        end if
        getAt=data(pos)
    End Function
    \'删除元素\'
    public Function delAt (byval pos)
        if pos<0 or pos>length-1 then exit Function \'注意退出函数的表达式\'
        dim i
        for i=pos to length-2
            data(i)=data(i+1)
        next
        length=length-1
        redim preserve data(length-1)
    End Function
    \'插入元素\'
    public Function insert (byval pos,byval elem)
        if pos<0 or pos>length-1 then exit Function 
        dim i
        length=length+1
        redim preserve data(length-1)
        for i=length-1 to pos+1 step -1
            data(i)=data(i-1)
        next
        data(pos)=elem
    End Function
end class
vector类

注意到外存传参这个操作可以抽象拿出来作为一个函数。编写extendProcess函数

public Function extendProcess (byval exe,byval arr) \'程序名、数组\'
    dim i
    dim cmd
    cmd=exe
    For i=0 To ubound(arr)
        cmd=cmd & " " & arr(i)
    Next
    dim objShell    \'执行命令\'
    Set objShell = CreateObject("Wscript.Shell")
    objShell.Run(cmd)
    \'读入输出文件val.txt\'
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set file = fs.OpenTextFile("val.txt", 1, false)
    info=file.readall
    file.close
    set fs=nothing 
    \'处理信息\'
    extendProcess=split(info)    \'用空格分隔\'
End Function

(在这里,程序名可以是cpp编译出来的exe,也可以是java字节码,调用方法:java 主类,也可以是python代码,调用方法: python scrip.py,甚至可以是MATLAB脚本,这里不赘述)

然后我们来愉快的测试吧,看看效果:

测试代码:

set v = new Vector
v.Add 1
v.Add 3
v.Add 5
v.Add 4
v.Add 6
v.Add 4
v.Add 7
v.Add 8
ans=extendProcess("mysort",v.data)    \'如果函数有返回,就必须要有括号。如果无返回,并且参数数目大于1,不能带括号\'
set v2 = new Vector
for each x in ans
    v2.Add x
next
v2.display

测试效果:

完整代码:

class Vector
    Private length
    public data()
    Sub Class_Initialize()
        length=0
    End Sub
    \'插入元素\'
    public Function Add (byval x)
        length=length+1
        redim preserve data(length-1)
        data(length-1)=x
    End Function
    \'快速展示\'
    public Function display()
        dim i
        dim s
        for i=0 to length-1
            s=s & cstr(data(i)) & " "
        next
        msgbox s
    End Function
    \'返回大小\'
    public Function size()
        size= length
    End Function
    \'获取元素\'
    public Function getAt (byval pos)
        if pos<0 or pos>length-1 then 
            getAt=0
            exit Function
        end if
        getAt=data(pos)
    End Function
    \'删除元素\'
    public Function delAt (byval pos)
        if pos<0 or pos>length-1 then exit Function \'注意退出函数的表达式\'
        dim i
        for i=pos to length-2
            data(i)=data(i+1)
        next
        length=length-1
        redim preserve data(length-1)
    End Function
    \'插入元素\'
    public Function insert (byval pos,byval elem)
        if pos<0 or pos>length-1 then exit Function 
        dim i
        length=length+1
        redim preserve data(length-1)
        for i=length-1 to pos+1 step -1
            data(i)=data(i-1)
        next
        data(pos)=elem
    End Function
end class


public Function extendProcess (byval exe,byval arr) \'程序名、数组\'
    dim i
    dim cmd
    cmd=exe
    For i=0 To ubound(arr)
        cmd=cmd & " " & arr(i)
    Next
    dim objShell    \'执行命令\'
    Set objShell = CreateObject("Wscript.Shell")
    objShell.Run(cmd)
    \'读入输出文件val.txt\'
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set file = fs.OpenTextFile("val.txt", 1, false)
    info=file.readall
    file.close
    set fs=nothing 
    \'处理信息\'
    extendProcess=split(info)    \'用空格分隔\'
End Function

set v = new Vector
v.Add 1
v.Add 3
v.Add 5
v.Add 4
v.Add 6
v.Add 4
v.Add 7
v.Add 8
ans=extendProcess("mysort",v.data)    \'如果函数有返回,就必须要有括号。如果无返回,并且参数数目大于1,不能带括号\'
set v2 = new Vector
for each x in ans
    v2.Add x
next
v2.display

\' dim objShell
\' Set objShell = CreateObject("Wscript.Shell")
\' objShell.Run("%comspec% /k ipconfig /all")
完整vbs代码

 

以上是关于vbs与其他语言进行交互编程(外存传参)的主要内容,如果未能解决你的问题,请参考以下文章

P1 总复习

脚本之美│VBS 入门交互实战

JNI 初级接触

JNI 初级接触

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?

转android JNI