WSC(Windows Script Components) を書いてみる。
[test.wsc]
<?xml version="1.0" standalone="yes" encoding="Shift-JIS" ?>
<package>
<?component error="True" debug="True"?> コンポーネントのデバッグ処理、エラーを有効にする
<component id="orgComp">
<registration progid="orgComp.test" version="1" remotable="True" />
<public>
<method name="test" />
</public>
<script language="VBScript">
<![CDATA[
Function test()
test = Now()
End Function
]]>
</script>
</component>
</package>
呼び出し
Set objtst = Server.CreateObject("orgComp.test")
Response.Write objtst.test
レジストリに登録が必要です。(右クリックで登録、削除が出来ます)
> regsvr32 test.wsc
他のマシンに実行させてみる(実行させるマシンでも登録が必要)
呼び出し元マシンで、
Set objtst = CreateObject("orgComp.test", "呼び出し先サーバー名")
Response.Write objtst.test
とかで動きます。※ Server.CreateObject は第2パラメータの指定が出来ません。
下記設定がいるかも。
COM+ に登録してクラス ID を抜き出し、test.wsc に classid を加える。
『コンポーネントサービス』(コントロールパネル>管理ツール)を起動
空の「COM+アプリケーション」を新規作成
上記「コンポーネント」(orgComp.test)を新規追加
プロパティから CLSID(値は128ビット)を抜き出しす。
<registration progid="orgComp.test" version="1" remotable="True" classid={ef541bc1-1864-4dbb-bvve-97a8742392ff}
※remotable="True" にした場合、分散環境で別のマシンにコンポーネントのインスタンス(コピー)を作ることが出来る。
追加したら、「アプリケーション」のエクスポート
呼び出し先マシンにコピーし、『コンポーネントサービス』を起動
既成の「アプリケーション」のインストールからコピーしたファイルを指定
ASP スクリプト コンポーネントの実装
スクリプトからタイプ ライブラリにアクセスする方法はありますか
WMI スクリプト入門 : 第 1 部
WMI スクリプト入門 : 第 2 部
クラスIDの簡単な作成方法
Set TypeLib = CreateObject("Scriptlet.TypeLib")
strGUID = TypeLib.Guid
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", strGUID
objIE.Quit
※クラスIDを生成してクリックボードへコピーします。
ついでに、クリップボードからの取得
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
strText = objIE.document.parentwindow.clipboardData.GetData("text")
objIE.Quit
Wscript.Echo strText
参考
スクリプトを使用して GUID を作成することはできますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/feb05/hey0221.mspx
クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx
ActiveX が安全だとマークする方法
HKEY_CLASSES_ROOT\CLSID\{A697E83F-3B53-11D1-8AE4-006097ED2008}\Implemented Categories\
この下に許可する CSLID を追加。
詳しくは KB909738 http://support.microsoft.com/kb/909738
Ping するツールを作ってみた。
Netdive.wsc
-------------------------------------------------------------
<?xml version="1.0" standalone="yes" encoding="Shift-JIS" ?>
<package>
<?component error="True" debug="True"?>
<component id="Netdive">
<registration progid="Netdive.ping" version="1" remotable="True" classid="{E631397E-0C13-4D04-85EC-D804C970CA7A}"/>
<public>
<property name="IP" put="setIP" get="getIP" />
<method name="ping" />
</public>
<object id="WshShell" progid="WScript.Shell" />
<script language="VBScript">
<![CDATA[
Dim strIP
Function setIP(newIP)
strIP = newIP
End Function
Function getIP()
getIP = strIP
End Function
Function ping()
Const PING_CMD = "ping -n 1 -w 100 "
Const PING_OK_STR = "Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),"
Dim sCmdLine
sCmdLine = PING_CMD & strIP
Ping = CBool(InStr(WshShell.Exec( sCmdLine ).StdOut.ReadAll, PING_OK_STR))
End Function
]]>
</script>
</component>
</package>
-------------------------------------------------------------
右クリックで登録後
※VISTA や Windows Server 2008 では、コマンドプロンプトを管理者権限で実行後に regsvr32 Netdive.wsc で登録できます。又は RUNAS コマンドで。
VBScript の場合
ping.vbs
-------------------------------------------------------------
Dim objtst
Set objtst = CreateObject("Netdive.ping")
With objtst
.ip = "61.194.16.124"
End With
Wscript.Echo "Ping Address:" & objtst.ip
Wscript.Echo "結果:" & objtst.ping
Set objtst = Nothing
-------------------------------------------------------------
ASPの場合
ping.asp
-------------------------------------------------------------
<%
Set objtst = Server.CreateObject("Netdive.ping")
With objtst
.ip = "61.194.16.124"
End With
Response.Write "Ping Address:" & objtst.ip & "<br>"
Response.Write "結果:" & objtst.ping
Set objtst = Nothing
%>
-------------------------------------------------------------
HTML でクライアントサイドで実行(未チェック)※HTML を表示する端末で事前に Netdive.wsc を登録しておく必要があります。
<object id=objtst clsid="clsid:E631397E-0C13-4D04-85EC-D804C970CA7A"></object>
<script language="vbs">
objtst.ip = "61.194.16.124"
ip.InnerHTML = objtst.ping
</script>
<div id="ip"></div>
-------------------------------------------------------------
Ping 部分は
http://winscript.s41.xrea.com/wiki/index.php
のスプリクトを利用させて頂きました。
後は、好き勝手に応用して下さいな。
※IISで別マシンから呼び出す場合はアクセス権に注意。
Set objtst = GetObject("script:c:\wsc\Netdive.wsc")
と書くと登録しなくても使えるようです(未確認)
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/letusingapp.asp
その他
Windows XP Service Pack 2 でリモート デバッグを有効にする方法
http://support.microsoft.com/default.aspx?scid=kb;ja;833977
リモート デバッグのセットアップ
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsdebug/html/vctskinstallingremotedebugmonitor.asp
単純にリモートで操作させるには下記記事参考に
リモート WSH をセットアップする
リモート・スクリプト実行のしくみと下準備(@IT)
ちなみに、ActiveX DLL の作り方も同じような感じです。
Private StrIP As String
Public Property Get IP() As String
IP = strIP
End Property
Public Property Let IP(newIP As String)
StrIP = newIP
End Property
------------------------------------------
て、クラスを宣言する感じで作成できます。
.NET Framework のばあいも同じですが、regsvr32.exe の代わりに RegAsm.exe を使っての登録になります。
コードを書くとこんな感じ。
Private StrIP As String
Public Property IP() As String
Get
Return StrIP
End Get
Set(ByVal newIP As String)
Dim pg As New System.Net.NetworkInformation.Ping()
Dim pr As System.Net.NetworkInformation.PingReply
Dim s As String
pr = pg.Send(newIP, 5)
If pr.Status = System.Net.NetworkInformation.IPStatus.Success Then
s = True
Else
s = False
End If
pg = Nothing
pr = Nothing
StrIP = s
End Set
End Property
'ついでにIPアドレスからホストネームを調べる
Public ReadOnly Property HostName() As String
Get
Dim s As String
Try
s = System.Net.Dns.GetHostByAddress(StrIP).HostName
Catch
s = ""
End Try
Return s
End Get
End Property
コンパイルしたDLLはこちら。※ホストネーム分は含まれていませんhttp://www.netdive.jp/download/ping.zip
クラスへ登録
x86
%windir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe netdive.dll /codebase
x64
%windir%\Microsoft.NET\Framework64\v2.0.50727\regasm.exe netdive.dll /codebase
後に
Set objNETDIVE = Wscript.CreateObject("netdive.ping1")
objNETDIVE.ip = "61.194.16.124"
Wscript.Echo objNETDIVE.ip
Set objNETDIVE = Nothing
てな感じで。.NET Framework のインストールが必要だし、使い道はなさそうだけど。
ちなみに登録解除は、/unregister
------------------------------------------
COM+ を利用したい場合は
http://msdn.microsoft.com/ja-jp/library/ms973809.aspx
http://msdn.microsoft.com/ja-jp/library/bctyca52.aspx
http://support.microsoft.com/kb/316516/
http://support.microsoft.com/kb/183771/
を参考に。
ActiveX DLL を使って IEからコントロールできるようになります。
C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには? − @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/1064combycs/combycs.html
ScriptLets 内で Response 等 ASP ハンドラを扱いたい場合は
<implements type="ASP" />
の1行を>object ・・・ の下の行辺りに追加すると利用出来るようになります。
WSC から Application、Session 変数にアクセスする場合は、 Application.Contents() とする必要がある事に注意
DHTML ビヘイビアハンドラ は
<implements type="Behavior" />
http://www.microsoft.com/japan/msdn/columns/scripting/scripting091399.aspx
Ping の実行
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/ping/
スマートピット
決済システム構築で、スマートピットも自動化出来るように作成しました。
SmartPit.zip
SmartPit.zip には、 SmartPit.wsc と readme.txt が含まれています。
詳しくはreadme.txtを見て下さい。
物がナニなので使える人は限定されますが・・・ MSXML を扱っています。
システムというか仕組みそのものの欠陥?について
どうも流通システムそのものに問題があるようで、、、
コンビニで入金>サービス開始。>コンビニで返金 ってされる恐れがあります。
全て自動化してサービスを提供している場合、トラブルになりますのでご注意を。。。
VBA の機能で VBScript に含まれていない機能
Select Case ステートメント
キーワード Is または比較演算子が含まれる式
キーワード To を使う値の範囲の指定が含まれる式
エラー処理
Erl 関数
Error ステートメント
Resume ステートメント、Resume Next ステートメント
演算子
Like 演算子
オブジェクト
Clipboard オブジェクト
Collection オブジェクト
オブジェクトの使用
演算子を使用したコレクションへの参照
オブジェクト操作
キーワード TypeOf
コレクション
Add メソッド、Count プロパティ、Item メソッド、Remove メソッド
! 演算子を使用したコレクションへの参照
財務処理
すべての財務処理関数
条件分岐
#Const ディレクティブ
#If...Then...#Else ディレクティブ
制御構造
DoEvents 関数
GoSub...Return ステートメント、GoTo ステートメント
On Error GoTo ステートメント
On...GoSub ステートメント、On...GoTo ステートメント
行番号、行ラベル
宣言
Declare ステートメント (DLL 参照のための宣言)
キーワード Optional
キーワード ParamArray
Static ステートメント
ダイナミック データ エクスチェンジ (DDE)
LinkExecute メソッド、LinkPoke メソッド、LinkRequest メソッド、LinkSend メソッド
データ型
バリアント型 (Variant) を除くすべての組み込みデータ型
Type...End Type ステートメント
デバッグ
Debug.Print
End ステートメント、Stop ステートメント
配列
Option Base ステートメント
0 以外のインデックスの最小値を指定した配列の宣言
日付と時刻
Date ステートメント、Time ステートメント
その他
Deftype ステートメント
Option Base ステートメント
Option Compare ステートメント
Option Private Module ステートメント
ファイル入出力
すべてのファイルの入出力機能
変換
CVar 関数、CVDate 関数
Str 関数、Val 関数
文字列
固定長文字列
LSet ステートメント、RSet ステートメント
Mid ステートメント
StrConv 関数
Visual Basic Scripting Edition VBA の機能で VBScript に含まれていない機能
資料
スクリプトからタイプ ライブラリにアクセスする方法はありますか
WMI スクリプト入門 : 第 1 部
WMI スクリプト入門 : 第 2 部
ステップ 7 イントロ オンライン セミナー : Visual Studio 2005 による分散アプリケーション開発編 「第 2 回 データ層の開発」