Call Win32 Api With Javascript

vbscript,javascript 中调用 win32 API 的实现。
http://blog.csdn.net/fupozsl/article/details/1904080

根据“脚本魔术师”的经验,发现用户只需要一种简单好用的脚本语言,并不需要很多语法的啰嗦。
“脚本魔术师”调用Win32 API 时只能做到传值的调用,对于要求用指针传递参数并未做合适的处理。
不过有上次的实现经验,这次写起来还是有一点信心。
先看一段vbscript 的代码:
dim Api
dim Param1
dim Param2
Set Api=NewObject("CCall") '获得CCall 实例
Set param1=NewObject("CMemory") '新增的内存管理对象
Set Param2=NewObject("CMemory") '参数2
Param1.NewStructMemory "lpName=s255" ' GetComputerName 函数 的第一个参数,分配255个字节
Param2.NewStructMemory "lpSize=p" ' GetComputerName 函数的第二个参数,该参数要求传指针
Param2.LetItemValue "lpSize",255 '赋值为255
dim addr
Api.LoadLib "Kernel32" 'GetComputerName 的库
addr=GetProcAddr("GetComputerNameA") '取得函数地址
Api.CallByAddress addr,Param1,Param2 '这样就完成了API的调用,其实可以用一个函数完成 CallApiByName(DllName,sFunctionName,Param….)
'取得计算机名
Computername=Param1.GetItemValue("lpName")'也可以用 0 作为参数,意指第一个参数,不过用伪名更可读
CMsgbox Computername 'NET-MANAGER
ComputernameLen=Param2.GetItemValue("lpSize")
CMsgbox ComputernameLen '11 接受到的实际长度
'清理现场
Set Param1=nothing
Set Param2=nothing
Set Api=nothing
'虽然还是麻烦点,但还是实现了,有了这个基础,再做一个 Wraper 或 CodeGen 不是难事
有人会问,那么对结构体的参数呢,比如:GetWindowRect
其实很容易,认真看上面的代码
Param2.NewStructMemory "Left=p","Top=p","Right=p","Bottom=p" '这样就完成了一个结构体的内存声明
我还是写写吧
dim Api
dim Param1
dim Param2
Dim Form1
Set Form=NewObject("Form","Form1")
Set Api=NewObject("CCall") '获得CCall 实例
Set param1=NewObject("CMemory") '新增的内存管理对象
Set Param2=NewObject("CMemory") '参数2
Param1.NewStructMemory "hwnd=l" ' 函数 的第一个参数,该参数使用值传递 类型指定为 "l"
Param2.NewStructMemory "Left=p","Top=p","Right=p","Bottom=p" 函数的第二个参数,该参数要求传结构体指针
Param1.LetItemValue "hwnd",Form1.hwnd '赋值为窗体的句柄
dim addr
Api.LoadLib "User32" 'GetWindowRect 的库
addr=GetProcAddr("'GetWindowRect ") '取得函数地址
Api.CallByAddress addr,Param1,Param2 '这样就完成了API的调用,其实可以用一个函数完成 CallApiByName(DllName,sFunctionName,Param….)
'取得计算机名
Left=Param2.GetItemValue("Left")'也可以用 0 作为参数,意指第一个参数,不过用伪名更可读
Top=Param2.GetItemValue("Top") '索引可用 1作为参数
……
CMsgbox "Left=" & Left & vbcrlf & "Top=" & Top
'清理现场
Set Param1=nothing
Set Param2=nothing
Set Api=nothing
Set Form1=nothing
EndApp true '结束程序