タグ:VBScript ( 58 ) タグの人気記事
[Delphi] スクリプト言語を利用し、ユーザによる処理実装を実現する方法 その1 : 実現方法の調査結果
どーもボキです。

世の中の処理系アプリには、
ユーザがスクリプト言語を記述することで処理機能を拡張できるもの多々ある。(例.Excelのマクロ機能)

そのスクリプト言語も、
C言語ベース、VBスクリプト+独自処理、完全なオリジナル言語 と多種多様。

EXEをスクリプト言語で拡張するメリット、それはコンパイル不要で機能拡張が出来ることだ。
コンパイルが不要になれば、拡張作業する場所(PC)を選ばない。拡張処理の修正や拡張もその場で出来る。
既存のコンポーネントを利用してスクリプト処理機能を実装できれば、自前で逆ポーランド記法処理をする必要もないわけだ。

実現方法が不思議でしょうがなかったスクリプト処理拡張機能、
色々調べているうちにその実装方法が徐々にわかってきた。


まずは、
Pascalベースのスクリプト言語拡張コンポーネントを利用する方法
 Project-PPA
 Pascalベースのスクリプトで拡張が可能になるので、Delphi使いには非常に扱いやすい。
 PPA = Poor Pascal for Application ということもあり、機能面ではすこし不足気味か?

次は本命、
Microsoft Script Control の ActiveX を利用する方法
 ・Microsoft Script Control の ActiveXコンポーネントの作成&インストール方法
  DelFusaBlog DelphiでVBScriptを使う(もうちょっとちゃんとした記事に...)
 ・サンプルプログラム
  DelFusaBlog VBScriptとの連携めんどうです。
 ・Delphi EXE と VBスクリプト 間のデータやりとり事例
  DelFusaBlog DelphiとVBScriptとの連携、VBScriptの関数に値渡したり、戻り値を受け取ったりする

 この方法なら、VBスクリプトの実装が可能になる。
 VBスクリプトが利用できるので、PPAより機能&信頼 の両面で勝っているだろう。

どちらもまだ使いこなせてはいないので、これから詳細を調べていく予定。
[PR]
by yozda | 2009-09-30 01:24 | プログラミング | Trackback | Comments(3)
[VBScript] Excelマクロに、ドロップされたファイルのパスを渡す をOpenOffice.orgでの実行… その4
どーもボキです。

OOo v3.1.1 が出てたので、前回同様Excelマクロを呼び出せるか試してみた。
結果は、「getScript は サポートされていない」エラー…。

やりたかったこと
 VBSからExcelに記述したマクロを引数付きで呼び出す

VBSを使って、OOoでExcelファイルを開き、そのマクロを呼び出すだけなら出来たけど (参照:その1)、
呼び出したマクロに引数を渡すってまでは出来ない。

マクロを呼び出すだけなら、ExcelマクロのAuto_Openを使えばいいからね。
わざわざVBSを使って呼び出すメリットがない。

検索するとgetScriptを記述したサンプルが見つかるけど、
出来たことあるんやろうか?

ネットって(悪意のない)ウソテクのことがあるから注意せなね。
[PR]
by yozda | 2009-09-08 20:40 | プログラミング | Trackback | Comments(0)
[VBScript] Excelマクロに、ドロップされたファイルのパスを渡す をOpenOffice.orgでの実行… その3
どーもボキです。

以下のバージョンのOOoで、getScriptを試したけど、
どれも「getScript は サポートされていない」エラー。

 v2.1.0
 v2.4.0
 v3.0.0
 v3.1.0

バージョンがまずいわけじゃなく、他に原因があるんだろう。
調べても分からんし、もうあきらめた。
[PR]
by yozda | 2009-06-17 23:59 | プログラミング | Trackback | Comments(0)
[VBScript] Excelマクロに、ドロップされたファイルのパスを渡す をOpenOffice.orgでの実行… その2
どーもボキです。

OOo(OpenOffice.org)のマクロを外部プログラムから実行する場合、本来はgetScriptでマクロを取得するみたい。
だが、ココに書いてある通り、getScrptメソッドを実行すると、メソッドが存在しないエラーが発生する。

VBScript、Delphiで同様のコードを試したが、
どちらもgetScriptメソッド実行のタイミングでエラーが発生した。

当然だが、記述言語に関係なくマクロが取得できないみたいだ。

getScriptでマクロを取得しなければ、引数付きでマクロを起動できない。
どうやってマクロを取得したらいいんだろう?

VBScript
Dim oSrv,oDsk,oDoc,oScP,oScr
Dim dummy()

' OpenOffice.orgに接続
Set oSrv = CreateObject("com.sun.star.ServiceManager")
Set oDsk = oSrv.createInstance("com.sun.star.frame.Desktop")

' ファイルを開く
Set oDoc = oDsk.loadComponentFromURL("file:///D:/Macro.xls", "_blank", 0, dummy)

' Module1.Testを取得
Set oScP = oDoc.getScriptProvider()
Set oScr = oScP.getScript("vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document")

' Testマクロを実行
oScr.invoke dummy, dummy, dummy
a0021757_23343346.gif


Delphi
uses
ComObj, Variants;

var
oSrv,oDsk,oDoc,oScP,oScr,dummy : Variant;

begin
dummy := VarArrayCreate([0,-1],varVariant);

// OpenOffice.orgに接続
oSrv := CreateOLEObject('com.sun.star.ServiceManager');
oDsk := oSrv.CreateInstance('com.sun.star.frame.Desktop');

// ファイルを開く
oDoc := oDsk.LoadComponentFromURL('file:///D:/Macro.xls','_blank',0,dummy);

// Module1.Testを取得
oScP := oDoc.getScriptProvider;
oScr := oScP.getScript('vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document');

// Testマクロを実行
oScr.invoke(dummy,dummy,dummy);
a0021757_23345239.gif

[PR]
by yozda | 2009-06-16 23:35 | プログラミング | Trackback | Comments(0)
[VBScript] Excelマクロに、ドロップされたファイルのパスを渡す をOpenOffice.orgでの実行… その1
どーもボキです。

OpenOffice.orgってのは、一言でいうと「無料のOffice Pro」。
(Pro = パワーポイント相当のアプリ付)

Officeとの互換性も(ある程度)あり、Officeで作成したファイルも開ける。
マクロ機能もあり、VBもサポートしている。(ある程度)

つまり、Excelマクロが開けて、マクロの実行も出来る。
VBScriptからマクロを引数付きで起動できるか試してみた。

結果は、指定したマクロは起動できたが、引数は渡せなかった
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
Dim dummy()
Set oDoc = objDesktop.loadComponentFromURL("file:///D:/ExcelMacro.xls", "_blank", 0, dummy)

Set oURL = objServiceManager.Bridge_getStruct("com.sun.star.util.URL")
oURL.Complete = "macro://ExcelMacro/Standard.Module1.Test"

Set oTrans = objServiceManager.createInstance("com.sun.star.util.URLTransformer")
Call oTrans.parseStrict(oURL)


Set oDisp = objDesktop.queryDispatch(oURL, "_self", 0)
Call oDisp.Dispatch (oURL, dummy)
ココのソースをちょこっといじっただけだけど。

上の例では、D:\ExcelMacro.xls の Module1 > Test というサブルーチンを呼び出してる。
それ以外のコードは、サッパリ意味がわからん。
[PR]
by yozda | 2009-06-13 23:06 | プログラミング | Trackback | Comments(0)
[VBScript] VBSにファイルがドロップされたファイルのパスをExcelマクロに渡す
どーもボキです。

始めにいっとくけど、ボカぁはExcelのマクロは、ほとんど知らにゃい。
それに嫌い。
Helpの検索が酷くないか? 「For」を検索すると「一致する項目はありません」って何よ。探せ!つうの。
エディタもパッチを当てなきゃマウスホイールでスクロールすら出来ないし。 これは、ココを参考に解決した。

まぁいい。

Excelマクロを使い、さまざまなファイルを処理したい場合、
そのファイル名をどうやって取得しているだろうか?

a0021757_1365287.gifEXEファイルのように、ファイルをドロップし処理させたい。
だが、これはできない。(左図)
ファイル選択ダイアログ を表示し、処理したいファイルをユーザに選ばせる」 という手もある。
だが、「ユーザへの負担は極力へらす」 を開発ポリシーの一つとしているボキとしては、これはありえない。
だって面倒じゃん、フォルダを探ってファイルを選択するのってさ。

色々調べていくうち、
VBSを経由すれば、Excelマクロにドロップされたファイルパスを渡せることが分かった。
サンプルプログラム (Excel、VBS)

VBSのコード
' Excelファイル名 と マクロ名
FName = "ExcelMacro.xls"
Macro = "ShowMsgBox"

If WScript.Arguments.Count = 0 Then
WScript.Quit
End If

' VBSの保存パスの取得

Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
DPath = objFS.GetParentFolderName(WScript.ScriptFullName) & "\"

' Excelファイルを開く
Set objXLS = CreateObject("Excel.Application")
objXLS.Workbooks.Open DPath & FName

' マクロを実行
For i = 0 To WScript.Arguments.count -1
objXLS.Run Macro, WScript.Arguments.Item(i)
Next

objXLS.Quit

Excelファイル「ExcelMacro.xls」に記述したマクロ
Sub ShowMsgBox(FPath As Variant)
MsgBox FPath
End Sub
VBS と Excel を同じフォルダに置き、VBSファイルにファイルをドロップすると、
以下のように、Excelマクロにドロップされたファイルのフルパスを渡っていることが確認出来る。
a0021757_1585617.gif

[PR]
by yozda | 2009-06-06 01:59 | プログラミング | Trackback | Comments(4)
[VBScript] 指定したIPアドレスが有効かどうか調べる
どーもボキです。

VBSで指定したIPアドレスが有効かどうか調べる関数。

Target には、IPアドレスの文字列を渡す。"192.168.11.1" とか。
IPアドレスが有効(Pingが通る)なら、True を返す。


【WindowsXP用】
 *Windows2000では、このコマンドは使えない。
Function myPing_XP(ByVal Target)
Set objWMIService = GetObject("winmgmts:\\.")
Set PingSet = objWMIService.ExecQuery("Select * From Win32_PingStatus Where Address = '"&Target&"'")
For Each Ping In PingSet
Select Case Ping.StatusCode
Case 0
r = True
'Case 11010
'MsgBox "Request Timed Out"

Case Else
r = False
End Select
Next


myPing_XP = r
End Function


【Windows2000用】
 コマンドプロンプトでPingを実行し、その結果文字列を受け取り処理する。
Function myPing_2k(ByVal Target)
Set objWS = CreateObject("WScript.Shell")
Set objExecObject = objWS.Exec("%comspec% /c ping -n 3 -w 1000 " & Target)
Do While Not objExecObject.StdOut.AtEndOfStream
strText = objExecObject.StdOut.ReadAll()
If Instr(strText, "TTL") > 0 Then
r = True
Else

r = False
End If
Loop


myPing_2k = r
End Function


WinXP用は、Vistaも使えると思う。
そんで、Win2k用は、WinME や Win98 もいけると思う。 でもいけるかどうかは未確認。


参考
 Hey, Scripting Guy! > ping を使用するスクリプトを Windows 2000 コンピュータで実行できないのはなぜですか

VBSって面白い。
[PR]
by yozda | 2009-02-17 20:00 | プログラミング | Trackback | Comments(0)
[ソフト] VbsEdit ~シェア:VBScriptのコード支援ができるエディタ~
どーもボキです。

WSHとは、Windows Script Host の略、名の通りWindowsのスクリプト実行環境のこと。
最近のWinOS(98~Vista)には、最初っから入ってる。

WSH自体は実行環境(スクリプトを動かすソフト)なので、
実際の処理は、VBScript や JScript というスクリプト言語で書く。

WSHを使えば、スクリプト処理で、
 ・レジストリの書き換え
 ・テキストファイルの読み書き
 ・ファイルやフォルダの作成・削除
ってなことが出来る。

「こんなこと自分でやりゃいいじゃん。そんなことが出来て何がうれしいん?」 って思う人もいるやろう。
けどPCに疎い人に、「この名前で共有フォルダを作ってくれ」 とか頼めると思うかね?
そら無理な話よ。そこでこのWSHを使うわけよ。

下のコードをテキストファイルにコピペして、拡張子を「vbs」として、
WScript.Echo "どーもボキです。"
出来たファイルを実行すれば、
a0021757_23353852.gif
となるわけ。
上の例はメッセージ出すスクリプトだが、共有フォルダを作るスクリプトを書けば、
あとはvbs実行さえすればいい。PCに疎い人でも共有フォルダが作れるって訳だ。

また、スクリプトの作成&実行には、テキストエディタ(メモ帳とか)さえあればいいってわけ。プログラムの勉強には最適ですな。
勉強に使うなら、Office系ソフトのマクロ習得もかねることが出来るVBScriptがオススメ。


ボキは、サクラエディタを使って、VBSを書いてたんだけど、
Delphiのように、コード支援機能に慣れてしまうと、エディタだけのコード作成ってちょっとしんどいのよね。
WSH自体、そんなには使う頻度ないから、Delphiほどは使いこなせてないし。

Delphiのようにコード支援してくれるエディタないかなーって探してみたら、見つけたよ。VbsEditっての。
名の通り、VBScriptのエディットに特化したエディタ。なのでJScript には対応していない。

a0021757_2051487.gifシェアウェアだが、レジストしなくても使える。
起動時 や スクリプト実行時 に レジストを促すメッセージが出るが、
使える機能に制約はないみたい。

図のようにコーディングを支援してくれる。これは非常に助かる。

Microsoft Script Debugger をインストールすることで、
デバッガと連携して、Delphiのようなデバッグが可能。
(というか、VbsEdit上の実行には、デバッガが必須)

さほど使う頻度がなかったWSH、これから勉強するつもり。
WSHには、テキストファイルを扱うオブジェクトが用意されてるので、
テキストファイルであれば、Delphi と同等の処理が可能なのよ。

ボキシステムのログ解析のように、
近い将来フォーマットが変わりえるテキストファイルの処理には、
Delphiで処理用EXEをつくりよりも、コンパイルが不要なWSHで、
いつでも処理内容の編集出来るようにしといた方が得策だからね。

WSHならどんな環境でも修正できるし。Officeのマクロをある程度いじれる人なら、改造できるからね。
SEなら、WSHは習得して損はないよ。
[PR]
by yozda | 2009-02-11 20:59 | プログラミング | Trackback | Comments(0)