vbs怎么c语言调用api函数数

WinCC&VBS利用EXCEL调用Windows&API函数
前面已经讨论过利用VBS的CreateObject方法来干很多以前不敢想象的事情,但Windows
API却没有办法,虽有DynmicWrapper.dll这样的东西,毕竟使用起来不方便,而且功能也有限。如果利用EXCEL作为突破口,VBS调用EXCEL的宏,而由EXCEL的宏来调用Windows
API正可以很好的解决这一问题。
1.&简单举例&
在API.XLS的Sheet1中加入如下代码:
Private Declare Function SHShutDownDialog Lib "shell32" Alias
"#60" (ByVal
YourGuess As Long) As Long
Public Sub ShowShutDownDlg() '显示关机界面
SHShutDownDialog 0
在WinCC调用之前先用EXCEL运行一下,效果如下:
接下来由WinCC的VBS调用如下:
Dim oExcelFile,oExcel,oWorkBook,oSheet
oExcelFile= HMIRuntime.ActiveProject.Path + "\APIXLS\API.XLS"
Set oExcel = CreateObject("Excel.Application")
Set oWorkBook = oExcel.workbooks.OPen(oExcelFile)
Set oSheet = oWorkBook.Sheets("Sheet1")
oExcel.run "Sheet1.ShowShutDownDlg"
oWorkBook.Close
Set oWorkBook = Nothing
oExcel.quit
Set oExcel = nothing
效果和EXCEL中是一模一样的,^_^。
2.&如何传递参数,和取得返回值&
但大多数时候我们需要调用一些API函数,传递某些值来获取返回值,比如FindWindow。
oExcel.run传递参数是可以的,比如EXCEL有宏:
Public Sub TestMsg(Msg As String)
MsgBox Msg
那么调用的时候用oExcel.run "Sheet1. TestMsg",”TEST MSG HERE” 即可。
但oExcel.run却不支持返回值的,因此得另想办法。其实也简单,利用Sheet1的表格来存放返回值就可以了,EXCEL宏调用后将值写入Range中,而VBS则读取该Range的值即可,以此达到取得返回值之目的,^_^。下面以FindWindow为例:
在API.XLS的Sheet1中加入如下代码:
接下来由WinCC的VBS调用如下:
但oExcel.run却不支持返回值的,因此得另想办法。其实也简单,利用Sheet1的表格来存放返回值就可以了,EXCEL宏调用后将值写入Range中,而VBS则读取该Range的值即可,以此达到取得返回值之目的,^_^。下面以FindWindow为例:&
在API.XLS的Sheet1中加入如下代码:
Private Declare Function FindWindow Lib "user32" Alias
"FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Public Sub xlsFindWindow(WindowTitle As String)
Dim hwnd As Long
hwnd = FindWindow(vbNullString, WindowTitle)
Sheet1.Range("A1").Value = hwnd
接下来由WinCC的VBS调用如下:
Dim oExcelFile,oExcel,oWorkBook,oSheet
oExcelFile= HMIRuntime.ActiveProject.Path + "\APIXLS\API.XLS"
Set oExcel = CreateObject("Excel.Application")
Set oWorkBook = oExcel.workbooks.OPen(oExcelFile)
Set oSheet = oWorkBook.Sheets("Sheet1")
oExcel.run "Sheet1.xlsFindWindow","WinCC-Runtime - "
'#向FindWindow传递参数
MsgBox oSheet.Range("A1").Value '#从Sheet中取得返回值
oExcel.DisplayAlerts = False
'#关闭EXCEL提示,因为我们对Sheet进行了修改,退出的时候会提示是否保存
oWorkBook.Close
Set oWorkBook = Nothing
oExcel.quit
Set oExcel = nothing
3.&性能优化&
大家都知道EXCEL调用起来是很慢的,尤其是每次CreateObject、workbooks.Open、oWorkBook.Close、oExcel.quit等等一整套程序下来,太浪费时间了,如果能像Public对象那样,自WinCC打开后就一直共享,自然要省事的多,而且也提高了执行效率。可以利用WinCC的DataSet对象来是Excel成为公共对象,关于DataSet详细使用见我的另一篇心得《WinCC
V6使用DataSet创建全局对象.doc》。
将以下代码放在起始页的OnOpen事件中:
On Error Resume Next '#必加,否则GetObject会报错
Dim oExcelFile,oExcel,oWorkBook,oSheet
oExcelFile= HMIRuntime.ActiveProject.Path + "\APIXLS\API.XLS"
'MsgBox oExcelFile
Set oExcel = GetObject(,"Excel.Application")
'#试图获取已经打开的EXCEL进程
'MsgBox TypeName(oExcel)
If VarType(oExcel)=vbEmpty Then
'#如果为找到EXCEL进程,则由CreateObject新建
Set oExcel = CreateObject("Excel.Application") '#新建EXCEL进程
Set oWorkBook = oExcel.workbooks(“API.XLS”)
'#试图获取已经打开的Excel文件
'MsgBox TypeName(oWorkBook)
If VarType(oWorkBook)=vbEmpty Then '#如未找到,则有Open打开Excel文件
Set oWorkBook = oExcel.workbooks.OPen(oExcelFile) '#打开Excel文件
'MsgBox oExcelFile & " Open Succeed!"
Set oSheet = oWorkBook.Sheets("Sheet1")
HMIRuntime.DataSet.Remove("oExcel")
HMIRuntime.DataSet.Add "oExcel",oExcel
'#将oExcel保存到DataSet中,以供其它调用
HMIRuntime.DataSet.Remove("oSheet")
HMIRuntime.DataSet.Add "oSheet",oSheet
'#将oSheet保存到DataSet中,以供其它调用
上面的代码用于WinCC启动后首先检测是否有EXCEL进程,否则则新建EXCEL进程,以保证同时只有一个EXCEL.EXE在进程中,然后将API.XLS打开,并将oExcel和oSheet保存到DataSet中,以供其它调用。
下面是WinCC任何页面中的调用方法:
Dim oExcel,oSheet
Set oExcel = HMIRuntime.DataSet("oExcel").Value
Set oSheet = HMIRuntime.DataSet("oSheet").Value
oExcel.run "Sheet1.xlsFindWindow","WinCC-Runtime - "
'#向FindWindow传递参数
MsgBox oSheet.Range("A1").Value
由于省掉了CreateObject和quit,调用速度非常快。
4.WinCC退出后关闭
当然在WinCC退出时要想办法把刚开始打开的EXCEL进程给关闭掉,否则内存都给EXCEL吃掉了。
标准函数里提供了OnDeactivateExecute,但这是C脚本,没有办法获取VBS的DataSet对象。只有在退出按钮中想办法了:
'#结束EXCEL
Dim oExcel
Set oExcel = HMIRuntime.DataSet.Item("oExcel").Value
oExcel.DisplayAlerts = False
oExcel.quit
Set oExcel = Nothing
'#退出WinCC
Dim WinCCODK
Set WinCCODK = CreateObject("WinCCODK.Admin")
WinCCODK.ExitWinCCEx &H1
不过也可以利用OnDeactivateExecute来调用相关的VBS而达到关闭EXCEL进程的目的。
void OnDeactivateExecute()
#define GetObject GetObject
__object *oWSH=NULL;
__object *HMIProj=NULL;
char VbsPath[255];
oWSH= __object_create("WScript.Shell");
HMIProj= __object_create("CCHMIRTProject.HMIProject");
sprintf(VbsPath,"%s\\OnDeactivateExecute.VBS",(char*)HMIProj-&Path);
//MessageBox(NULL,VbsPath,"test",MB_OK);
oWSH-&Run(VbsPath);
__object_delete(oWSH);
__object_delete(HMIProj);
鉴于C脚本调用自动化对象比较难调试,而且OnDeactivateExecute已经没有办法使用GSC诊断,因此以上的C脚本仅为调用项目路径下的OnDeactivateExecute.VBS,剩下的工作交给它就可以了。
'****该脚本用于WinCC退出时由标准函数OnDeactivateExecute进行调用***
On Error Resume Next
Dim oExcel,oWorkBook
Dim fso,FilePath
Set fso=CreateObject("Scripting.FileSystemObject")
FilePath=fso.GetFolder(".").Path & "API.xls"
'MsgBox FilePath
Set oExcel = GetObject(,"Excel.Application")
oExcel.DisplayAlert = False
oExcel.WorkBooks(FilePath).Close
oExcel.quit
Set oExcel = nothing
Set fso = Nothing
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。& & Set&os=CreateObject("wscript.shell")& & Set&os0=CreateObject("shell.application")& & Do& & input1=InputBox("&请选择:"+chr(13)+chr(13)+&_& & "1.&全部窗口最小化"+chr(13)+&_& & "2.&窗口状态复原"+chr(13)+&_& & "3.&窗口均匀平铺"+chr(13)+&_& & "4.&窗口纵向平铺"+chr(13)+&_& & "5.&窗口重叠展开"&+Chr(13)+&_& & "6.&资源管理器"+chr(13)+&_& & "7.&设置系统时间"&+Chr(13)&+&_& & "8.&刷新系统菜单"&+Chr(13)+&_& & "9.&手动设置开始菜单"+Chr(13)+&_& & "10.&搜索文件"+Chr(13)+&_& & "11.&搜索计算机"+Chr(13)+&_& & "12.&运行"+Chr(13)+&_& & "13.&帮助"+Chr(13)+&_& & "14.&打开文件夹"+Chr(13)+&_& & "15.&挂起系统"+Chr(13)+&_& & "16.&关闭系统"&+Chr(13)+&_& & "","vbs&shell32&功能调用")& & Select&Case&input1& & Case&1& & os0.MinimizeAll& & Case&2& & os0.UndoMinimizeALL& & Case&3& & os0.TileHorizontally& & Case&4& & os0.TileVertically& & Case&5& & os0.CascadeWindows& & Case&6& & p1=os.SpecialFolders("desktop")& & os0.Explore(p1)& & Case&7& & os0.SetTime& & Case&8& & os0.RefreshMenu& & Case&9& & os0.TrayProperties& & Case&10& & os0.FindFiles& & Case&11& & os0.FindComputer& & Case&12& & os0.FileRun& & Case&13& & os0.Help& & Case&14& & Set&path1=os0.BrowseForFolder(0,"选择要打开的文件夹:",0)& & If&path1&Is&Nothing&Then& & Else& & os0.Open(path1.self.path)& & End&If& & Case&15& & os0.Suspend& & Case&16& & os0.ShutdownWindows& & Case&""& & Exit&Do& & Case&Else& & os.Popup&"选择错误",2,"错误",64+0& & End&Select& & loop& & & & QQ空间
百度搜藏更多& & Tags:vbs shell.application 函数& & 复制链接收藏本文打印本文关闭本文返回首页& & 上一篇:用vbs实现的瞬间关闭多个系统进程的脚本& & 下一篇:vbs 解析html文档的方法(htmlfile)& & 相关文章VBS教程:方法-GetParentFolderName 方法VBS教程:VBScript. 与窗体Msxml2.XMLHTTP Msxml2.ServerXMLHTTP与缓存VBS编程教程 (第6篇)VBS教程:VBscript语句-Dim 语句奇特的js写法,或许可以用来加密躲杀毒软件什么的VBS操作Excel常见方法vbs获取当前路径的代码用vbs控制iis创建虚拟目录的代码利用vbs脚本实现设置IE的打印页眉页脚信息& & 文章评论& & 最 近 更 新& & 运行脚本之前,如何确定计算机上的默认脚VBS教程:方法-Close 方法可以将Bat转换位VBS文件的VBS脚本vbs fso跨盘移动文件夹的怪问题更牛的一句话asp木马加密(去掉asp里的%)VBS教程:属性-Size 属性用vbs确定可移动驱动器的连接时间VBS 加解密 For MS Script. EncodeVBS教程:函数-IsNull 函数vbs自动填表单分析附源码& & 热 点 排 行& & vbs整人代码大集合 多年的代码收Wscript.Shell 对象详细介绍!!vbs脚本大全,配有实例 DOS命令,按键精灵 脚本-学习VBS的一个不错VBS操作Excel常见方法VBS常用脚本 好东西收藏的比较精典VBS代码vbs教程 chm下载运行bat时隐藏cmd窗口的方法(bat常用VBS代码 值得一看
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
论文写作技巧君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
 VBS调用API 对话框 相关说明性文字来自网络收集,欢迎下载
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
 VBS调用API 对话框
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口vbs如何调用dll_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
vbs如何调用dll
上传于||暂无简介
你可能喜欢下次自动登录
现在的位置:
& 综合 & 正文
VBS和JS互相调用方法
vbscript和javascript互相调用方法
ASP具备管理不同语言脚本的能力,能够自动调用合适的脚本引擎以解释脚本和执行内置函数。ASP开发环境提供了两种脚本引擎,即VBScript(缺省)和JScript。不过,开发者并没有被限制于只能使用这两种语言,只要能够提供合适的ActiveX脚本引擎就能使用任何脚本语言。  脚本语言的选择往往基于许多不同原因:它可能是开发者最为熟悉的语言,可能是对给定工程来说能够提供最多特色支持的,也有可能是最具效率的。不同的环境和要求使得我们在选择脚本语言时注重不同的因素,同时也使得我们在某些时候面临选定的脚本语言不能直接提供其它语言固有的函数这一问题,或某个脚本已经写成但用的却是另外一种脚本语言。
  此时应该怎么办?是否需要用当前所用的脚本语言重写这些脚本?或者说,是否有可能在一种脚本语言中调用其它脚本语言的内置函数?本文要说明的就是在ASP应用中如何让VBScript脚本和JScript脚本交互以最大限度地获得两种脚本语言的特色支持。
  一、VBScript和JScript的内置函数
  在VBScript和JScript中,有大量的内置函数功能是相同或类似的。然而,在一种脚本语言中内置的函数并非总是在另外一种脚本语言中也有对应的函数。例如,VBScript提供了许多用于操作字符串和格式化数据的函数,这些函数在JScript中并不存在。这些函数包括StrReverse()、Filter()以及FormatCurrency()等。在另一方面,JScript所提供的用于管理数组、字符串编码等的函数在VBScript中也没有定义,如join()、reverse()、pow()、位操作、escape()和unescape()等。
  那么,如果在JScript程序中需要一个VBscript函数该怎么办呢?
  二、异种脚本的互相调用
  如果需要在JScript脚本中调用一个VBScript中内置的函数,则应该写一个VBScript用户定义函数(在这里调用VBScript内置函数),然后在JScript脚本中象调用公用JScript函数一样调用这个用户定义函数。
  例如,如果要调用的VBSCript内置函数是FormatCurrency(),则可以声明如下自定义函数:
  &SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER"&  Function FormatValue(Value)     FormatValue = FormatCurrency(Value)  End Function  &/SCRIPT&
  接下来在JScript代码中就可以象普通JScript函数一样调用FormatValue()了。用类似的方法也可以实现VBScript代码调用JScript函数。
  应用同样的规则,我们可以在任何脚本内调用任何用户定义函数。不过,从JScript脚本内调用一个不带参数的VBScript过程(Sub)时应略加注意,此时在JScript中应该象调用一个不带参数的JScript函数一样调用它,如用foo()调用VBScript Sub foo过程。
  三、数据共享
  在某些情形下混合运用VBScript和JScript函数是非常有用的,但在不同语言脚本之间共享数据也可能很有用。实现这种共享的方法很简单:不管使用的是什么语言,只要是在页面级声明的变量就可以任意引用。
  对象的使用方法也相似,可以任意选用合适的语言读取、修改属性或调用对象的方法。当然给定对象的属性和方法是由创建该对象实例的语言所定义的。正如上例VBScript的过程调用,当从JScript中调用一个不带参数的VBScript对象的方法时,其调用方法也遵从JScript的调用规则,反之亦然。
  四、数组管理
  数组共享问题稍微复杂一点。虽然数组也象其它变量一样可以在不同语言脚本之间共享,但必须注意兼容方面的问题。
  VBScript数组在JScript下可以用VBScript的符号引用,即用myArray(2)引用数组元素而不是JScript的数组元素引用符号myArray[2]。此外,还可以使用一个特殊的JScript对象——VBArray对象将VBScript数组转换为JScript数组。下面的代码从VBScript数组myVBArray创建JScript数组myJSArray:
 var Temp = new VBArray(myVBArray) var myJSArray myJSArray = Temp.toArray()
  上述代码首先创建一个临时的VBArray对象,然后使用它的toArray()方法将自己转换为JScript数组。此后就可以象普通JScript数组一样使用myJSArray,如myJSArray[1]。但应当注意的是,toArray()方法将把一个多维的VBArray转换为一维的JScript数组。
  从VBScript中引用JScript数组更为复杂。虽然在VBScript中我们可以直接访问JScript数组相关的方法和属性,但没有直接访问JScript数组的单个元素的方法。也就是说,我们可以在VBScript脚本中读取JScript数组的长度属性,如下所示:
  x = myJSArray.length
  但无法直接读取该数组的单个元素,下面的VBScript代码是不正确的:
  x = myJSArray(3)
  解决该问题的一个可行的方法是执行一个转换过程,如下面的代码所示,此处假定VBScript是缺省的脚本语言:
&%  Dim Temp  Dim myVBArray  Temp = myJSArray.join(", ")  myVBArray = Split(Temp, ", ")%&
  此处的JScript join()方法将数组myJSArray元素转换到一个以逗号为分割符的字符串,VBScript Split()函数将字符串转换为VBScript数组。注意这里我们是在VBScript环境下调用JScript的join方法。依照此例,我们可以通过自定义VBScript函数来模拟JScript的VBArray对象的toArray()方法以实现JScript数组到VBScript数组的转换。
  五、小结
  在同一个ASP工程内灵活选用不同脚本语言具有许多优点,这些脚本之间的交互能力更为开发者集成不同语言所提供的内置函数和其它功能带来了更多的机会,同时也使得实现既可用于VBScript也可用于JScript环境的通用脚本库成为可能。
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 vbs 调用自定义函数 的文章

 

随机推荐