最近、入力のお仕事を請けるようになり、少しでも協力者の入力が楽になるよう、
色々と支援ツールを作っています。
特にブラウザ経由で入力する場合、ブラウザを操作するようなプログラムを作る
と楽になります。しかも実際にブラウザを操作可能な端末が限定されている場合、
通常の方法だと著しく作業効率が落ちるため、何らかの手段が必要です。
別に入力画面を模したページをphp+Ajaxで作成し、そこからVBScriptファイルを
生成するような仕掛けを作り、そのVBScriptファイルでブラウザ操作が可能にな
るところまではすんなりできたのですが、VBScriptファイル内である程度ブラウ
ザを動かす仕掛けを組み込むとなると、今度は機密保持上の考慮もしなければな
りません。(むろんパスワードなどは手入力でいれていただくようにし、その部
分はあえて外しました)
ブラウザ操作のコア部分をVBScriptとしてエンコード化し、デコードされる可能
性を踏まえたうえで、vbeファイルとし、入力する対象レコードごとにphpで生成
したwsfファイルとして作成しました。実際に協力者が入力した部分は変数として
wsfファイルに書くことで、引数を沢山vbeに渡す煩雑さから逃れられるかなぁ。。
と思ったのです。
↓↓↓↓Data.wfs↓↓↓↓
<job id=”Entry”>
<script language=”VBScript.Encode” src=”Data.vbe”/>
<script language=”VBScript”>
Private strEntry1
Private strEntry2
Private Const strCode = “123456789”
strEntry1 = “○○○○○○○○○××××○○○○○○○○”
strEntry2 = “○△■△■○○○××××△■○○△■▽○”
Call DataEntry()
</Script>
</job>
↑↑↑↑Data.wfs↑↑↑↑
↓↓↓↓Data.vbe↓↓↓↓
option explicit
Public Sub DataEntry()
Dim ObjShell
Dim WshShell
Set WshShell = CreateObject(“Wscript.Shell”)
Set ObjShell = CreateObject(“Shell.Application”)
~処理内容~
Msgbox strCode
Msgbox strEntry1
Msgbox strEntry2
Set ObjShell = Nothing
Set WshShell = Nothing
Ene Sub
↑↑↑↑Data.vbe↑↑↑↑
ところが、このコード、wsfを実行すると、エラーになってしまいます。vbeの中で使用
するstrCodeやstrEntry1やstrEntry2の変数が宣言されていないというエラーです。よう
は呼び出し元で宣言した変数が継承されていないわけです。
ところが、
↓↓↓↓Data.wfs↓↓↓↓
<job id=”Entry”>
<script language=”VBScript” src=”Data.vbs”/>
<script language=”VBScript”>
Private strEntry1
Private strEntry2
Private Const strCode = “123456789”
strEntry1 = “○○○○○○○○○××××○○○○○○○○”
strEntry2 = “○△■△■○○○××××△■○○△■▽○”
Call DataEntry()
</Script>
</job>
↑↑↑↑Data.wfs↑↑↑↑
のように、Data.vbsとエンコード前のファイルを指定し呼ばれるData.vbsもエン
コード前の素のファイルを用意します。そうすると、正常に処理が行われてしま
うんですね。
なんででしょう・・・ただvbsを使ってしまうと最低限の機密保持という目的が達
成できません・・・こまりました・・・
結局
↓↓↓↓Data.wfs↓↓↓↓
<job id=”Entry”>
<script language=”VBScript.Encode” src=”Data.vbe”/>
<script language=”VBScript”>
Private strEntry(2)
strEntry(0) = “123456789”
strEntry(1) = “○○○○○○○○○××××○○○○○○○○”
strEntry(2) = “○△■△■○○○××××△■○○△■▽○”
Call DataEntry(strEntry)
</Script>
</job>
↑↑↑↑Data.wfs↑↑↑↑
↓↓↓↓Data.vbe↓↓↓↓
option explicit
Public Sub DataEntry(strEntry)
Dim ObjShell
Dim WshShell
Set WshShell = CreateObject(“Wscript.Shell”)
Set ObjShell = CreateObject(“Shell.Application”)
処理内容
Msgbox strEntry(0)
Msgbox strEntry(1)
Msgbox strEntry(2)
Set ObjShell = Nothing
Set WshShell = Nothing
Ene Sub
↑↑↑↑Data.vbe↑↑↑↑
と配列の引数渡しにすることでコード数を減らすのが精いっぱいでした・・・
このあたりの呼び出し先をvbsとvbeにすることで変数のスコープが異なる件、
かなり調べたのですが見つかりませんでした・・・内部的なエンジンの問題な
のでしょうか・・・