吉里吉里プラグインに関するメモ/win32ole.dll

Last-modified: 2016-03-28 (月) 11:55:17

吉里吉里2 2.26 rc2のtvp2win32-2.26stable\kirikiri2\src\plugins\win32\krkr_win32ole\manual.tjsを整形・補足したもの。

WIN32OLEクラス

コンストラクタ

WIN32OLE.WIN32OLE

機能/意味
WIN32OLEオブジェクトの構築
タイプ
WIN32OLEクラスのコンストラクタ
構文
WIN32OLE(name)
引数
name…識別名またはCLSIDを文字列で指定
戻り値
なし(void)
説明
WIN32OLEクラスのオブジェクトを構築します

メソッド

WIN32OLE.invoke

機能/意味
メソッドの実行
タイプ
WIN32OLEクラスのメソッド
構文
invoke(name, ...)
引数
name…メソッド名
以下パラメータ
戻り値
実行するメソッドに依存
説明
メソッドを実行します

WIN32OLE.set

機能/意味
プロパティの設定
タイプ
WIN32OLEクラスのメソッド
構文
set(name, value)
引数
name…プロパティ名
value…設定値
戻り値
なし(void)
説明
プロパティに値を設定します

WIN32OLE.get

機能/意味
プロパティの取得
タイプ
WIN32OLEクラスのメソッド
構文
get(name)
引数
name…プロパティ名
戻り値
プロパティの設定値
説明
プロパティの値を取得します

WIN32OLE.getConstant

機能/意味
定数の取得
タイプ
WIN32OLEクラスのメソッド
構文
getConstant(obj=this)
引数
obj…オブジェクト
戻り値
定数値
説明
指定したオブジェクトのプロパティとして定数を取得します。objを省略した場合は自分のオブジェクト内部に取得します

WIN32OLE.addEvent

機能/意味
イベント受信オブジェクトの登録
タイプ
WIN32OLEクラスのメソッド
構文
addEvent(eventName, receiver)
引数
eventName…イベント種別名(例:"DWebBrowser2Events2")
receiver…イベントを受けるオブジェクト
戻り値
なし(void)
説明
オブジェクトが持つイベント名と同じ名前のメソッドが呼び出されます。該当するメソッドが無い場合はなにも処理されません

サンプル

フォルダ選択ダイアログボックスを開くサンプル(TJS)

要コモンダイアログコントロール(comdlg32.ocx)。
VB6ランタイムライブラリなどに同梱されている。
ベクターにも類似のインストーラが公開されている。

// フォルダ選択ダイアログボックスを開くサンプル
var BIF_RETURNONLYFSDIRS = 0x01;  // ファイルシステムディレクトリのみを返す
var BIF_EDITBOX = 0x10;           // エディットコントロールを表示
Plugins.link("win32ole.dll");
var objApplication = new WIN32OLE("Shell.Application");
var objFolder = objApplication.BrowseForFolder(0, "フォルダを選択してください", BIF_RETURNONLYFSDIRS|BIF_EDITBOX);
if (objFolder == null)
  System.inform("キャンセルしました");
else if (!objFolder.Self.IsFileSystem)  // BIF_RETURNONLYFSDIRSが利かないケースへの対処
  System.inform("エラー:そのフォルダは選択できません");
else
  System.inform(objFolder.Items().Item().Path);
invalidate objApplication;

テキストファイルを作成するサンプル(TJS)

// テキストファイル(Shift JISコード)を作成するサンプル
Plugins.link("win32ole.dll");
var objFileSystem = new WIN32OLE("Scripting.FileSystemObject");
var objTextFile = objFileSystem.CreateTextFile("test.txt", true);
objTextFile.WriteLine("TextStreamオブジェクトならテキストファイルを");
objTextFile.WriteLine("読み書きすることができます。");
// ↑with (objTextFile) { .WriteLine(...); }と書くとエラーになる
objTextFile.Close();
invalidate objTextFile;
invalidate objFileSystem;
System.inform("(krkr.eXeと同じフォルダに)test.txtを作成しました");

DAOでデータベース(CSVファイル)を扱うサンプル*1

Plugins.link("win32ole.dll");
Debug.console.visible = Debug.controller.visible = true;
// DBEngineオブジェクトを獲得
var objDBE = new WIN32OLE("DAO.DBEngine.36");
// Workspaceオブジェクトを獲得
var objWS = objDBE.Workspaces(0);
// Databaseオブジェクトを獲得
var objDB = objWS.OpenDatabase("C:\\DATABASE", false, false, "Text");
// リスト.csvから男性のデータのみ抽出し、年齢順にソート
var objRS = objDB.OpenRecordset("SELECT * FROM [リスト.csv] WHERE 性別=\'男\' ORDER BY 年齢");
// 結果をコンソールに出力
while (!objRS.EOF) {
  Debug.message("氏名=%s, 年齢=%s".sprintf(objRS("氏名").Value, objRS("年齢").Value));
  objRS.MoveNext();
}
// 後始末
objRS.Close();
objDB.Close();
invalidate objRS;
invalidate objDB;
invalidate objWS;
invalidate objDBE;

C:\DATABASE\リスト.csvの内容は以下の通り。

NO,氏名,性別,年齢
1,阿井宇江男,男,20
2,可貴久毛子,女,18
3,沙士須瀬素,男,19
4,太知津手斗,男,22
5,奈荷濡音乃,女,20
6,羽比不経保,男,24

XMLファイルをダウンロードするサンプル(HTTP GET)

kikyou.infoからtags.xmlをダウンロードする例。tags.xmlの文字コードがUnicode(UTF-8)のため、saveStruct.dllで文字コードを合わせている。

Plugins.link("win32ole.dll");
Plugins.link("saveStruct.dll");
Debug.console.visible = Debug.controller.visible = true;
var strURL = "http://devdoc.kikyou.info/tvp/docs/kag3doc/contents/tagdb_xml/tags.xml";
//var strKey = "userid=ユーザーID&pass=パスワードとか";  // ←この辺りは未確認
var objHTTP = new WIN32OLE("MSXML2.XMLHTTP");
objHTTP.Open("GET", strURL, false);
objHTTP.Send;
//objHTTP.Send(strKey);
Debug.message("Status = " + objHTTP.Status);
if (objHTTP.Status == 200) {
  var arr = new Array();
  arr.add(objHTTP.ResponseText);
  arr.save2("tags.xml", true, 0);
  invalidate arr;
}
invalidate objHTTP;
  • POSTもできると思うが確認していない
  • MSXML2.XMLHTTP.ResponseBody経由でバイナリファイルのダウンロードはできない模様(ADODB.Streamへ渡す際にエラーになる)

備考

  • コレクションも扱えるが、コレクションの各要素への繰り返し処理はサポートされていないため、不便
    • TJSにはVBScriptのFor Each Element In Collection~Nextに相当する構文がない上に、JScriptのEnumeratorに相当するクラスもない
  • 確認した限りでは、WIN32OLEオブジェクトのメソッドで作成したCOMオブジェクト(例:上記サンプルのTextStreamオブジェクト)にwithステートメントは適用できない。なお、WIN32OLEオブジェクトにはwithステートメントが適用できる
  • COMオブジェクトのメソッドで引数なしのものは、 Win32OleObject.Method() ではなく Win32OleObject.Method または Win32OleObject.invoke("Method") と書かないとエラーになるケースがある
    • 下記サンプルのWeb Browser interfaceオブジェクトの場合、 objIE.GoHome() と記述するとエラーになる

ActiveXクラス

スーパークラス

WIN32OLEクラス

コンストラクタ

ActiveX.ActiveX

機能/意味
ActiveXオブジェクトの構築
タイプ
ActiveXクラスのコンストラクタ
構文
ActiveX(name, win=null, left=0, top=0, width=100, height=100)
引数
name…識別名またはCLSIDを文字列で指定(※WIN32OLEの指定とはCLSIDの書式が違うので注意;CAxWindow::CreateControlの書式)
win…指定するとそのウインドウの上に生成します。省略すると独立ウインドウになります
left…表示座標。ウインドウ指定かつ省略の場合はウインドウのクライアント領域の左上
top…表示座標。ウインドウ指定かつ省略の場合はウインドウのクライアント領域の左上
width…表示サイズ。ウインドウ指定かつ省略の場合は親ウインドウのクライアント領域のサイズ
height…表示サイズ。ウインドウ指定かつ省略の場合は親ウインドウのクライアント領域のサイズ
戻り値
なし(void)
説明
ActiveXクラスのオブジェクトを構築します

メソッド

ActiveX.setPos

機能/意味
座標指定
タイプ
ActiveXクラスのメソッド
構文
setPos(left, top)
引数
left…左端座標
top…上端座標
戻り値
なし(void)
説明
コンポーネントの表示座標を設定します

ActiveX.setSize

機能/意味
サイズ指定
タイプ
ActiveXクラスのメソッド
構文
setSize(width, height)
引数
width…横幅
height…縦幅
戻り値
なし(void)
説明
コンポーネントの表示サイズを設定します

ActiveX.setExternalUI

機能/意味
拡張UI指定
タイプ
ActiveXクラスのメソッド
構文
setExternalUI()
引数
なし
戻り値
なし(void)
説明
IEコンポーネントでのみ意味を持ちます。現在の版では、これ呼び出すことでコンテキストメニューが抑制されます

プロパティ

ActiveX.left

機能/意味
左端座標
タイプ
ActiveXクラスのプロパティ(読み書き可能)
説明
コンポーネントの左端座標を表します

ActiveX.top

機能/意味
上端座標
タイプ
ActiveXクラスのプロパティ(読み書き可能)
説明
コンポーネントの上端座標を表します

ActiveX.width

機能/意味
横幅
タイプ
ActiveXクラスのプロパティ(読み書き可能)
説明
コンポーネントの横幅を表します

ActiveX.height

機能/意味
縦幅
タイプ
ActiveXクラスのプロパティ(読み書き可能)
説明
コンポーネントの縦幅を表します

ActiveX.visible

機能/意味
表示状態
タイプ
ActiveXクラスのプロパティ(読み書き可能)
説明
コンポーネントの表示状態を表します

サンプル

MS Agentを表示するサンプル(TJS)

WindowsMe/2000/XPなら標準でMS Agentがインストールされている。

// MS Agentを表示する簡単なサンプル
Plugins.link("win32ole.dll");
class EventHandler {
  var character = void;
  function EventHandler() { }
  function finalize() { }
  function Click(CharID, Button, Shift, X, Y)
  {
    if (character !== void)
      character.Speak("あいた!");
  }
  function DblClick(CharID, Button, Shift, X, Y)
  {
    if (character !== void)
        character.Speak("いたた!!!");
  }
  function Show(CharID, X, Y, Cause)
  {
    if (character !== void)
        character.Speak("呼ばれて飛び出てジャジャジャジャーン♪(古");
  }
  function DragComplete(CharID, Button, Shift, X, Y)
  {
    if (character !== void)
        character.Speak("ほっ");
  }
}
var control = new ActiveX("Agent.Control.1");
control.Connected = true;
control.Characters.Load("Agent");
var ev = new EventHandler();
control.addEvent("_AgentEvents", ev);
var character = control.Characters("Agent");
ev.character = character;
character.MoveTo(100, 100);
character.Show();
System.inform("MS Agentを表示しました");
invalidate character;
invalidate control;

Internet Explorerのコントロールを埋め込むサンプル(TJS)

Plugins.link("win32ole.dll");
class WebBrowserWindow extends Window
{
  var menu_file;  // [ファイル]メニュー
  var menu_open;  // [ファイル‐開く]メニュー
  var menu_exit;  // [ファイル‐閉じる]メニュー
  var menu_move;  // [移動]メニュー
  var menu_prev;  // [移動‐前へ]メニュー
  var menu_next;  // [移動‐次へ]メニュー
  var menu_home;  // [移動‐ホーム]メニュー
  var objIE;      // ウェブブラウザオブジェクト
  function WebBrowserWindow()
  {
    super.Window();
    caption = "吉里吉里/Web Browser";  // タイトルバーのキャプションを設定
    setInnerSize(640, 480);            // クライアント領域サイズを640×480ピクセルに変更
    visible = true;                    // ウィンドウを表示する
    // [ファイル]メニューを作成
    menu_file = new MenuItem(this, "ファイル(&F)");
    menu.add(menu_file);
    menu_file.add(menu_open = new MenuItem(this, "開く(&O)..."));
    menu_file.add(new MenuItem(this, "-"));
    menu_file.add(menu_exit = new MenuItem(this, "閉じる(&C)"));
    // [移動]メニューを作成
    menu_move = new MenuItem(this, "移動(&M)");
    menu.add(menu_move);
    menu_move.add(menu_prev = new MenuItem(this, "前へ(&P)"));
    menu_move.add(menu_next = new MenuItem(this, "次へ(&N)"));
    menu_move.add(new MenuItem(this, "-"));
    menu_move.add(menu_home = new MenuItem(this, "ホーム(&H)"));
    // ウェブブラウザオブジェクトを獲得
    objIE = new ActiveX("Shell.Explorer.2", this);
    with (objIE) {
      .setPos(0, 0);      // ウィンドウの左上隅に配置
      .invoke("GoHome");  // ホームページを開く
    }
  }
  function finalize()
  {
    invalidate objIE;
    super.finalize();
  }
  function onResize()
  {
    // ウェブブラウザオブジェクトのサイズをウィンドウのサイズに合わせる
    objIE.setSize(innerWidth, innerHeight);
  }
  function action(ev)
  {
    switch (ev.target) {
    case menu_open:    // [ファイル‐開く]メニューが選択された
      var address = System.inputString("開く", "インターネットアドレスを入力してください", "http://www.google.co.jp/");
      if (address !== void && address != "")
        objIE.Navigate2(address);
      break;
    case menu_exit:    // [ファイル‐閉じる]メニューが選択された
      close();
      break;
    case menu_prev:    // [移動‐前へ]メニューが選択された
      objIE.invoke("GoBack");
      break;
    case menu_next:    // [移動‐次へ]メニューが選択された
      objIE.invoke("GoForward");
      break;
    case menu_home:    // [移動‐ホーム]メニューが選択された
      objIE.invoke("GoHome");
      break;
    }
  }
}
var win = new WebBrowserWindow();

FLASH Playerのコントロールを埋め込むサンプル(TJS)

要FLASH Player 9以降。krflash.dllを組み込まなくてもFLASHが再生できることが判る。

Plugins.link("win32ole.dll");
class FlashPlayerWindow extends Window
{
  var menu_file;     // [ファイル]メニュー
  var menu_open;     // [ファイル‐開く]メニュー
  var menu_exit;     // [ファイル‐閉じる]メニュー
  var menu_play;     // [再生]メニュー
  var menu_again;    // [再生‐再生]メニュー
  var menu_stop;     // [再生‐停止]メニュー
  var menu_rewind;   // [再生‐巻き戻す]メニュー
  var menu_loop;     // [再生‐ループ]メニュー
  var objFlash;      // FLASHプレイヤーオブジェクト
  function FlashPlayerWindow()
  {
    super.Window();
    caption = "吉里吉里/FLASH Player";  // タイトルバーのキャプションを設定
    setInnerSize(640, 480);             // クライアント領域サイズを640×480ピクセルに変更
    visible = true;                     // ウィンドウを表示する
    // [ファイル]メニューを作成
    menu_file = new MenuItem(this, "ファイル(&F)");
    menu.add(menu_file);
    menu_file.add(menu_open = new MenuItem(this, "開く(&O)..."));
    menu_file.add(new MenuItem(this, "-"));
    menu_file.add(menu_exit = new MenuItem(this, "閉じる(&C)"));
    // [再生]メニューを作成
    menu_play = new MenuItem(this, "再生(&P)");
    menu.add(menu_play);
    menu_play.add(menu_again = new MenuItem(this, "再生(&A)"));
    menu_play.add(menu_stop = new MenuItem(this, "停止(&S)"));
    menu_play.add(menu_rewind = new MenuItem(this, "巻き戻す(&N)"));
    menu_play.add(new MenuItem(this, "-"));
    menu_play.add(menu_loop = new MenuItem(this, "ループ(&L)"));
    // FLASHプレイヤーオブジェクトを獲得
    objFlash = new ActiveX("ShockwaveFlash.ShockwaveFlash.9", this);
    with (objFlash) {
      .setPos(0, 0);    // ウィンドウの左上隅に配置
      .visible = true;
      menu_loop.checked = .Loop;
    }
  }
  function finalize()
  {
    objFlash.invoke("StopPlay");
    invalidate objFlash;
    super.finalize();
  }
  function onResize()
  {
    // FLASHプレイヤーオブジェクトのサイズをウィンドウのサイズに合わせる
    objFlash.setSize(innerWidth, innerHeight);
  }
  function action(ev)
  {
    switch (ev.target) {
    case menu_open:    // [ファイル‐開く(ファイル指定)]メニューが選択された
      var params = %[
        "filter"=>[["SWFファイル(*.swf)|*.swf"]]
      ];
      if (Storages.selectFile(params)) {
        objFlash.LoadMovie(0, Storages.getLocalName(params.name));
      }
      invalidate params;
      break;
    case menu_exit:    // [ファイル‐閉じる]メニューが選択された
      close();
      break;
    case menu_again:   // [再生‐再生]メニューが選択された
      objFlash.invoke("Play");
      break;
    case menu_stop:    // [再生‐停止]メニューが選択された
      objFlash.invoke("StopPlay");
      break;
    case menu_rewind:  // [再生‐巻き戻す]メニューが選択された
      objFlash.invoke("Rewind");
      break;
    case menu_loop:    // [再生‐ループ]メニューが選択された
      objFlash.Loop = menu_loop.checked = !menu_loop.checked;
      break;
    }
  }
}
var win = new FlashPlayerWindow();

関連項目


*1 ADOも扱えると思うのだが、ODBCの設定がまずいのかデータソースへの接続を開く際に「データソース名および指定された既定のドライバが見つかりません」というエラーになってしまう…。ADOX/JROは未確認。