vbs调用系统api的终极办法

很多年前,我经常用vbs来做很多事情。

但那个时候调用一些外界api的时候都没有遇到问题。

之所以没有遇到问题是因为我没有调用系统的核心api,如今真要用系统api的时候,才发现原来不是那么容易。

又或者是因为当时我在借用excel内的vba来解决。

但现在遇到很多电脑真的没有装office,或者安了没有激活好。

所以必须脱离office来想办法。

发现原来有人早就想过办法。先是一个美国人搞出了一个dll来解决这个事。

后来这个美国人不玩这个了。

于是又有个叫Yuri Popov的俄罗斯人来解决这个问题,我们只要到他的主页去下载这个dll就可以了。
http://www.script-coding.com/dynwrapx_eng.html#download
使用方法可以看它的主页中的说明。

下面是一些例子:

如Beep的API声明为

Public Declare Function Beep Lib “kernel32″ Alias “Beep” (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

则使用方法如下

‘创建对象
Set Wrap = CreateObject(“DynamicWrapperX”)
‘注册API
Wrap.Register “KERNEL32.DLL”, “Beep”, “i=ll”, “f=s”, “r=l”
‘调用API
Wrap.Beep(500, 100)
其中注册API中, “i=ll”是API的参数类型, “f=s”是调用方式, “r=l”是返回类型
这些可以参考下面的说明。

REM i: (Argument Type)
REM ‘a’, sizeof(IDispatch*), VT_DISPATCH} // a IDispatch*
REM ‘c’, sizeof(unsigned char), VT_I4} // c signed char
REM ‘d’, sizeof(double), VT_R8} // d 8 byte real
REM ‘f’, sizeof(float), VT_R4} // f 4 byte real
REM ‘k’, sizeof(IUnknown*), VT_UNKNOWN} // k IUnknown*
REM ‘h’, sizeof(long), VT_I4} // h HANDLE
REM ‘l’, sizeof(long), VT_I4} // l long
REM ‘p’, sizeof(void*), VT_PTR} // p pointer
REM ‘s’, sizeof(BSTR), VT_LPSTR} // s string
REM ‘t’, sizeof(short), VT_I2} // t short
REM ‘u’, sizeof(UINT), VT_UINT} // u unsigned int
REM ‘w’, sizeof(BSTR), VT_LPWSTR} // w wide string

REM f: (Call Method)
REM ‘m’ – DC_MICROSOFT 0x0000, Default
REM ‘b’ – DC_BORLAND 0x0001, Borland compat
REM ‘s’ – DC_CALL_STD 0x0020, __stdcall
REM ‘c’ – DC_CALL_CDECL 0x0010, __cdecl
REM ‘4’ – DC_RETVAL_MATH4 0x0100, Return value in ST
REM ‘8’ – DC_RETVAL_MATH8 0x0200, Return value in ST

REM r: (Return Type)
REM Same as i
示例:

‘用机箱内的蜂鸣器播放音乐
Sub BeepMusic()
Set Wrap = CreateObject(“DynamicWrapperX”)
Wrap.Register “KERNEL32.DLL”, “Beep”, “i=ll”, “f=s”, “r=l”
res = Wrap.Beep(500, 100)
res = Wrap.Beep(550, 100)
res = Wrap.Beep(600, 100)
res = Wrap.Beep(650, 100)
res = Wrap.Beep(700, 700)
WScript.Sleep 200
res = Wrap.Beep(700, 100)
res = Wrap.Beep(650, 100)
res = Wrap.Beep(600, 100)
res = Wrap.Beep(550, 100)
res = Wrap.Beep(500, 700)
End Sub
BeepMusic
‘取前景窗体标题
Sub GetForeWindowCaption()
Const WM_GETTEXT = &HD
Set Wrap = CreateObject(“DynamicWrapperX”)
Wrap.Register “USER32.DLL”, “GetForegroundWindow”, “f=s”, “r=l”
Wrap.Register “USER32.DLL”, “SendMessage”, “i=lllr”, “f=s”, “r=l”
Title = Space(100)
res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_GETTEXT , 100, Title)
GetForeWindowCaption = Title
End Sub
MsgBox GetForeWindowCaption
‘发送键盘消息,显示桌面
Sub ShowDesktop()
Const VK_LWIN = &H5B
Const VK_D = &H44
Public Const KEYEVENTF_KEYUP = &H2
Set Wrap = CreateObject(“DynamicWrapperX”)
Wrap.Register “USER32.DLL”, “keybd_event”, “i=ccll”, “f=s”
Wrap.keybd_event VK_LWIN, 0, 0, 0
Wrap.keybd_event VK_D, 0, 0, 0
Wrap.keybd_event VK_D, 0, KEYEVENTF_KEYUP, 0
Wrap.keybd_event VK_LWIN, 0, KEYEVENTF_KEYUP, 0
End Sub
ShowDesktop

lnmp创建https主机失败

安装了lnmp,很多事情比自己分开装nginx和php什么的要方便多了。

用lnmp vhost add命令创建虚拟主机有个好处。

就是可以直接生成ssl证书,

全站https很轻松,不用自己改conf配置文件,也不用去申请证书什么的。

其实是因为人家内置了证书申请功能。

但是我今天创建主机的时候,遇到报错,内容如下:

Let’s Encrypt SSL Certificate create failed!

光看这个是看不出所以然的。

可以看日志。

但是看日志也看不出所以然……

还得自己想想问题所在。

其实问题很简单,就是因为脚本自动申请证书的时候,会需要验证域名。

然而,我在架主机的时候没有做域名解析!

所以证书申请失败。

至于说免费证书靠不靠谱?

应该是靠谱的吧。

反正目前用了一两年也没问题,不过每年似乎都要更新。

在阿里和腾讯申请的证书每年似乎都会过期。

lnmp内置的那个,不知道什么时候过期。

到时候可能是要折腾一下了。

对了,遇到证书问题怎么办呢?

最简单的办法就是直接删除主机重建。

lnmp vhost del

放心,它不会删除你的文件的,也就是干掉一点配置文件而已。