ole モジュール

ole モジュールでは、Windows内のActiveXライブラリーを呼び出し、操作とそれを補助するためのクラスをそろえています。
ole モジュールにあるクラスを呼び出すには、require関数を使います。

例えば
    var {ActiveX} = require("ole");
    var excel = new ActiveX("Excel.Application");
    excel.Visible = true;
次のようにしても同じ。
    var ActiveX = require("ole").ActiveX;
    var excel = new ActiveX("Excel.Application");
    excel.Visible = true;
以下の説明で ActiveX, AxEnum, AxEventSink, AxVar が現れたら、 次の宣言文でセットされた クラスであることに留意してください。
  var {ActiveX} = require("ole");
  var {AxEnum} = require("ole");
  var {AxEventSink} = require("ole");
  var {AxVar} = require("ole");
  または
  var {ActiveX, AxEnum, AxEventSink, AxVar} = require("ole");

ActiveX クラス ...

MicrosoftのActiveXオブジェクトを扱うクラスです。

ActiveXオブジェクトのメソッド・プロパティは、 最初のアクセス時に、Library情報をもとに作成されます。(レイトバインディング)
必要なものだけロードされるため、メモリーを占有しないで軽快にActiveXオブジェクトを操作できます。

ActiveX : プロパティ・関数・・・リスト
classNameプロパティ クラス名の取得
membersプロパティ 関数とプロパティの列挙
Propertyプロパティ 引数なしのプロパティ
$Property(...).$, Property(...).$ プロパティ プロパティ
ActiveXコンストラクター AciveXオブジェクトを作成
close関数 AciveXオブジェクトを閉じます。
exec, at関数 ActiveXオブジェクトのメソッド関数を実行
get, geta関数 ActiveXオブジェクトのプロパティ値を取得
get_Property関数 ActiveXオブジェクトのプロパティ値を取得
id関数 メソッド,プロパティ名のid番号を取得
set, seta関数 ActiveXオブジェクトのプロパティ値を設定
set_Property関数 ActiveXオブジェクトのプロパティ値を設定
toString関数 ActiveXオブジェクトのtoString関数を実行
cancelWaitEventsクラス関数 ActiveXイベント待ちを中止する
getObjectクラス関数 ファイルからActiveX オブジェクトを取得
isクラス関数 ActiveXオブジェクトであるか判定
loadConstsクラス関数 ActiveXオブジェクトのタイプライブラリーから定数を取り出す
newEventSinkクラス関数 ActiveXオブジェクトのイベントを受信するオブジェクトを作成
showHelpクラス関数 ActiveXオブジェクトのヘルプマニュアルを起動
waitEventsクラス関数 ActiveXイベント待ち

className プロパティ ActiveX...

クラス名の取得

activex.className : String [ReadOnly]

解説
常に"ActiveX"を返します。
var {ActiveX} = require("ole");

var obj = new ActiveX("Excel.Application");
alert( obj.className );  //"ActiveX"

members プロパティ ActiveX...

関数とプロパティの列挙

activex.members : Object

解説
ActiveXオブジェクトの関数名とプロパティ名を列挙するオブジェクトを返します。
オブジェクトのプロパティ値は、ActiveXオブジェクトの関数とプロパティの(引数,返値)情報を文字列化しています。
関数の情報文字列
  activex.members[func] => "[id(funcId)] function( argInf, ... ) : retType"
    funcId == activex.id(func)
    argInf = [属性] 引数タイプ 引数名
             [in]  argType argname     //入力引数
             [out] argType argname     //出力引数
             [in,out] argType argname  //入出力引数

プロパティの情報文字列
  activex.members[prop] => "[id(propId)] get( argInf, ... ) : retType"
                           "[id(propId)] set( argInf, ..., [in] refType rhs )"
    propId == activex.id(prop)
    argInf = [属性] 引数タイプ 引数名

引数・返値タイプ
  基本型
    char   : Integer
    short  : Integer
    USHORT : Integer
    long   : Integer/Number
    ULONG  : Integer/Number
    float  : Number
    double : Number
    DATE   : Date
    BSTR   : String
    VARIANT_BOOL : Boolean
  ActiveXオブジェクト
    IDispatch* : ActiveX
    Typename*  : ActiveX  (TypenameはIDLファイルを参照)
  VB/COMの汎用型
    VARIANT : AxVar
  配列型
    SAFEARRAY(type) : type[]
  列挙型
    Enumname : Integer/Number  (EnumnameはIDLファイルを参照)
  
var {ActiveX} = require("ole");

var excel = new ActiveX('Excel.Application');

for (var m in excel.members) {
  print(m + " => " + excel.members[m]);
}
/*
Application => [id(148)] get() : Application*
Creator => [id(149)] get() : XlCreator
Parent => [id(150)] get() : Application*
ActiveCell => [id(305)] get() : Range*
ActiveChart => [id(183)] get() : Chart*
ActivePrinter => [id(306)] get() : BSTR
[id(306)] set( [in] BSTR rhs )
  ・
  ・
CentimetersToPoints => [id(1086)] function( [in] double Centimeters ) : double
CheckSpelling => [id(505)] function( [in] BSTR Word, [in,optional] CustomDictionary, [in,optional] IgnoreUppercase ) : VARIANT_BOOL
  ・
  ・
*/

Property プロパティ ActiveX...

引数なしのプロパティ

activex.Property

解説
PropertyはActiveXオブジェクトの引数なしまたはあっても引数を与えないプロパティです。
代入は、
    activex.Property = value;
これは、activex.set("Property",value); と同じです。

取り出しは、
    v = activex.Property;
これは、v = activex.get("Property"); と同じです。
参照
$Property(...).$, get, get_Property, set, set_Property
var {ActiveX} = require("ole");

// ExcelオブジェクトのVisibleプロパティ
var excel = new ActiveX('Excel.Application');
print(excel.Visible); // 最初は非表示のfalse
excel.Visible = true;   // Excelを表示

$Property(...).$, Property(...).$ プロパティ ActiveX...

プロパティ

activex.$Property([arg, arg2, ...]).$
activex.Property(arg[, arg2, ...]).$

引数
Property
プロパティ名
arg, arg2, ...
プロパティの引数
解説
$Property(...).$はActiveXオブジェクトのプロパティを確実にアクセスできます。
Property(...).$は1つ以上の引数を持つプロパティをアクセスできます。
代入は、
    activex.$Property(arg).$ = value; または activex.Property(arg).$ = value;
これは、activex.set("Property",arg,value); と同じです。

取り出しは、
    v = activex.$Property(arg).$; または v = activex.Property(arg).$;
これは、v = activex.get("Property",arg); と同じです。
さらに取り出したプロパティ値にメンバー関数やプロパティを 「.」演算子で値を取り出す場合、最後の「$」は省略可能です。     activex.$Property(arg).$.Value または activex.Property(arg).$.Value
は、activex.$Property(arg).Value または activex.Property(arg).Value と同じ。
参照
Property, get, get_Property, set, set_Property
var {ActiveX} = require("ole");

// ExcelのActiveSheetセルに値をセット
var excel = new ActiveX('Excel.Application');
excel.Visible = true;   // Excelを表示
excel.Workbooks.Add();
var activesheet = excel.ActiveSheet;
var cells = activesheet.Cells;
cells(2,3).Value = "Hello"; // cells(2,3).$.Value = "Hello";
cells(3,3).Value = cells(2,3).Value + " JavaScript!"; // cells(3,3).$.Value = cells(2,3).$.Value + " JavaScript!";

ActiveX コンストラクター ActiveX...

AciveXオブジェクトを作成

new ActiveX( id ) : ActiveX
new ActiveX( dlname, clsid ) : ActiveX

new AciveXObject( id ) : ActiveX
new AciveXObject( dlname, clsid ) : ActiveX

引数
id : String
プログラムID または クラスIDを指定します。
dlname : String
AciveXオブジェクトのサーバーとなるdllプログラム名を指定します。
clsid : String
クラスIDを指定します。
返値
作成したActiveXオブジェクトを返します。
解説
プログラムIDは、"Excel.Application"などの文字列です。
クラスIDは{}で囲まれた数列の文字列です。("{00024500-0000-0000-C000-000000000046}")
var {ActiveX} = require("ole");

var excel = new ActiveX('Excel.Application');
// var obj = new ActiveXObject('Excel.Application');

close 関数 ActiveX...

AciveXオブジェクトを閉じます。

activex.close()

解説
ActiveXオブジェクトを閉じます。使用されなくなったActiveXオブジェクトのプログラムを開放します。

exec, at 関数 ActiveX...

ActiveXオブジェクトのメソッド関数を実行

activex.exec( name[,args...])
activex.at( name[,args...])

引数
name : String or Integer
ActiveXのメソッド名またはメソッドid番号。
args...
メソッド関数へ渡す引数。引数の数と型は、メソッド関数(name)によって決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
返値
メソッド関数(name)によって返値の型が決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
解説
引数nameがメソッド名である場合、id関数でメソッドid番号に変換してexec関数を実行します。
var {ActiveX} = require("ole");

var excel = new ActiveX('Excel.Application'); // var obj = new ActiveXObject('Excel.Application');
excel.set('Visible',true);    // プロパティ値設定

var workbooks = excel.get('Workbooks'); // プロパティ値取得

workbooks.exec('Open','D:\\Work\\Book1.xls'); // メソッド関数実行

get, geta 関数 ActiveX...

ActiveXオブジェクトのプロパティ値を取得

activex.get( name[,args...])
activex.geta( name[,args...])

引数
name : String or Integer
ActiveXのプロパティ名またはプロパティid番号。
args...
プロパティへ渡す引数。引数の数と型は、プロパティ関数(name)によって決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
返値
プロパティ(name)によって返値の型が決まります。
参照
Property, $Property(...).$, get_Property, set, set_Property
解説
ActiveXオブジェクトのプロパティ値を取得します。 取得できる型はBoolean, Number, null, String, ActiveXオブジェクトです。 引数nameがプロパティ名である場合、id関数でプロパティid番号に変換してget関数を実行します。

seta関数でnameが番号である場合、プロパティid番号でなくプロパティ名として解釈します。

get_Property 関数 ActiveX...

ActiveXオブジェクトのプロパティ値を取得

activex.get_Property([args, ...])

引数
Property
ActiveXのプロパティ名
args...
プロパティへ渡す引数。引数の数と型は、プロパティ(Property)によって決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
返値
プロパティ(Property)によって返値の型が決まります。
解説
ActiveXオブジェクトのプロパティ値を取得します。 取得できる型はBoolean, Number, null, String, ActiveXオブジェクトです。 ActiveXオブジェクトのプロパティ値を取得します。 activex.get("Property",[args, ...])と同じ。
参照
Property, $Property(...).$, get, set, set_Property
var {ActiveX} = require("ole");

// ExcelオブジェクトのVisibleプロパティ
var excel = new ActiveX('Excel.Application');
print(excel.get_Visible()); // 最初は非表示のfalse
excel.set_Visible(true);   // Excelを表示

id 関数 ActiveX...

メソッド,プロパティ名のid番号を取得

activex.id( name ) : Integer

引数
name : String
ActiveXのメソッド名またはプロパティ名
返値
id番号を返します。ActiveXオブジェクトがnameのid番号を持っていなければnullを返します。

set, seta 関数 ActiveX...

ActiveXオブジェクトのプロパティ値を設定

activex.set( name[,args...], value)
activex.seta( name[,args...], value)

引数
name : String or Integer
ActiveXのプロパティ名またはプロパティid番号。
args...
プロパティへ渡す引数。引数の数と型は、プロパティ関数(name)によって決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
value : Any
プロパティに設定する値です。nameによって受け付ける値の型があります。 ActiveXオブジェクトライブラリーの説明資料を参照してください。
解説
引数nameがプロパティ名である場合、id関数でプロパティid番号に変換してget関数を実行します。

seta関数でnameが番号である場合、プロパティid番号でなくプロパティ名として解釈します。

参照
Property, $Property(...).$, get, get_Property, set_Property

set_Property 関数 ActiveX...

ActiveXオブジェクトのプロパティ値を設定

activex.set_Property([args...], value)

引数
Property
ActiveXのプロパティ名。
args...
プロパティへ渡す引数。引数の数と型は、プロパティ(Property)によって決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
value : Any
プロパティに設定する値です。Propertyによって受け付ける値の型があります。 ActiveXオブジェクトライブラリーの説明資料を参照してください。
解説
ActiveXオブジェクトのプロパティに値を設定します。 activex.set("Property",[args, ...],value)と同じ。
参照
Property, $Property(...).$, get, get_Property, set

toString 関数 ActiveX...

ActiveXオブジェクトのtoString関数を実行

activex.toString() : String

返値
ActiveXオブジェクトのtoString関数の実行結果を返します。もしtoString関数がなければexec(0)の実行結果をかえします。

cancelWaitEvents クラス関数 ActiveX...

ActiveXイベント待ちを中止する

ActiveX.cancelWaitEvents()

var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
excel.Visible = true;

var cnt = 0;
var eventSink = ActiveX.newEventSink(excel); // =ActiveX.newEventSink(excel,"AppEvents");
eventSink.setHandler("NewWorkbook",
 function(wb) { // Workbookが新規に作成すると呼ばれる
   // wb : Workbook
   alert( "new Workbook" );
   cnt++;
   if (cnt==3) ActiveX.cancelWaitEvents(); // 3個新しいWorkbookが作成されたら、イベント待ちを中止
 }
);

ActiveX.waitEvents(); // イベント待ち
                //すべてのAxEventSinkオブジェクトがunAdvise()するか、
                // ActiveX.cancelWaitEvents()が実行されたら、このイベント待ちを終了する

getObject クラス関数 ActiveX...

ファイルからActiveX オブジェクトを取得

ActiveX.getObject( pathname ) : ActiveX
ActiveX.getObject( id ) : ActiveX

引数
pathname : String
取得するオブジェクトが含まれているファイルの絶対パスおよびファイル名。
id : String
プログラムid(appname.objectype の形式) または クラスid ({00024500-0000-0000-C000-000000000046})。
返値
pathnameを渡した場合、既にロードされていればロードされているそのActiveXオブジェクトを返します。まだそのファイルがロードされていなければそのファイルをロードしてそのActiveXオブジェクトを返します。
idを渡した場合、idに対応するアプリケーションが起動していればそのActiveXオブジェクトを返します。アプリケーションが起動していなければ例外エラーが起こります。
var {ActiveX} = require("ole");

var book = ActiveX.getObject("D:/Work/Book2.xls"); //Book2.xlsがロードされていなければロードされる
var excel = book.Application;

excel.Windows(book.name).Visible = true;
excel.Visible = true;
var cell = excel.Range('B3');
print( cell.Value );

is クラス関数 ActiveX...

ActiveXオブジェクトであるか判定

ActiveX.is( obj )

引数
obj : Object
オブジェクト
返値
objがActiveXオブジェクトなら trueを返します。そうでなければ falseを返します

loadConsts クラス関数 ActiveX...

ActiveXオブジェクトのタイプライブラリーから定数を取り出す

consts = ActiveX.loadConsts( activexobj[, enum_name] ) : Object

引数
activexobj : ActiveX
ActiveXオブジェクト
enum_name : ActiveX
列挙名
返値
ActiveXオブジェクトactivexobjから取得できるタイプライブラリーから、定数名をプロパティ名とし、値をプロパティ値としたObjectを返します。
列挙名を引数に与えた場合、その列挙名に含まれる定数をActiveXオブジェクトのタイプライブラリーから取り出します。
特に列挙名として "*" を渡すと以下のプログラムを実行したことと同じです。:
  consts = {};
  for (var enm in activexobjのタイプライブラリーに含まれる列挙名) {
    consts[enm] = ActiveX.loadConsts(activexobj,enm);
  }
  // 定数の取得方法 : consts.列挙名.定数名
var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
var consts = ActiveX.loadConsts(excel);
alert( consts.xlDialogOpen ); // 1

var consts_RowCol = ActiveX.loadConsts(excel,"XlRowCol");
alert( consts_RowCol.xlColumns ); // 2

var consts = ActiveX.loadConsts(excel,"*");
alert( consts.XlRowCol.xlColumns ); // 2

newEventSink クラス関数 ActiveX...

ActiveXオブジェクトのイベントを受信するオブジェクトを作成

ActiveX.newEventSink( activexobj, [event_interfacename] ) : AxEventSink

引数
activexobj : ActiveX
ActiveXオブジェクト
event_interfacename : String
イベントインターフェース名。省略時にはactivexオブジェクトのdefaultイベントソース名を指定したことになる。
返値
activexオブジェクトにevent_interfacenameインターフェースに対応したイベント送信機能があれば、イベントを受信するAxEventSinkオブジェクトを返す。そうでなければnullを返します。
var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
excel.Visible = true;

var cnt = 0;
var eventSink = ActiveX.newEventSink(excel); // =ActiveX.newEventSink(excel,"AppEvents");
eventSink.setHandler("NewWorkbook",
 function(wb) { // Workbookが新規に作成すると呼ばれる
   // wb : Workbook
   alert( "new Workbook" );
   cnt++;
   if (cnt==3) eventSink.unAdvise(); // 3個新しいWorkbookが作成されたら、eventSinkでのイベント待ちをoffにする
 }
);

ActiveX.waitEvents(); // イベント待ち
                //すべてのAxEventSinkオブジェクトがunAdvise()するか、
                // ActiveX.cancelWaitEvents()が実行されたら、このイベント待ちを終了する

showHelp クラス関数 ActiveX...

ActiveXオブジェクトのヘルプマニュアルを起動

ActiveX.showHelp( activexobj )

引数
activexobj : ActiveX
ActiveXオブジェクト
var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
ActiveX.showHelp(excel);

waitEvents クラス関数 ActiveX...

ActiveXイベント待ち

ActiveX.waitEvents( [wait_time] ) : Boolean

引数
wait_time : Integer
ActiveXイベントの待ち時間(ミリセコンド)。デフォルト値は-1.
wait_time≦0なら無限時間待機する。
返値
ActiveXのイベント待ちしてこの関数を終了した場合、trueを返します。
ActiveX.waitEvents(...)を実行中に再度ActiveX.waitEvents(...)を実行した場合、falseを返します。 またイベントハンドラーが1つも登録されていない場合もfalseを返します。
falseを返した場合、 イベント待ちしていません。
解説
引数で指定された wait_timeミリセカンド間、ActiveXオブジェクトイベント待ちし制限時間がきたら、ActiveX.waitEvents(...)の実行を終了して trueを返します。 ただし、ActiveX.waitEvents(...)を実行中、ActiveX.cancelWaitEvents()が実行したり、AxEventSink::unAdvise()の実行で登録されたイベントハンドラーがなくなった場合、イベント待ち時間中であってもActiveX.waitEvents(...)を終了します。
var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
excel.Visible = true;

var cnt = 0;
var eventSink = ActiveX.newEventSink(excel); // =ActiveX.newEventSink(excel,"AppEvents");
eventSink.setHandler("NewWorkbook",
 function(wb) { // Workbookが新規に作成すると呼ばれる
   // wb : Workbook
   alert( "new Workbook" );
   cnt++;
   if (cnt==3) eventSink.unAdvise(); // 3個新しいWorkbookが作成されたら、eventSinkでのイベント待ちをoffにする
 }
);

ActiveX.waitEvents(60*1000); // 一分間イベント待ち
                //すべてのAxEventSinkオブジェクトがunAdvise()するか、
                // ActiveX.cancelWaitEvents()が実行されたら、このイベント待ちを終了する

AxEnum クラス ...

ActiveXオブジェクトが持っているコレクション(要素群)を順に取り出すことを目的とした列挙クラスです。
VB言語では、このコレクション要素を順に取り出す言語構文 For Each ~ In ~ を持っています。これはActiveXオブジェクト専用であるため、JavaScriptの言語構文 foreach(~ in ~) ~ ではコレクション要素を取り出せません。それをAxEnumオブジェクトを使って以下のように代用できます。

VBでコレクション要素を順に取り出す場合
Dim fs, f, subf, f1

Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(".")

'すべてのサブフォルダを表示
For Each subf In f.SubFolders
    WScript.Echo("[" & subf.Name & "]")
Next

'すべてのファイルを表示
For Each f1 In f.Files
    WScript.Echo(f1.Name)
Next
  
JavaScriptでコレクション要素を順に取り出す場合
var fs = new ActiveX("Scripting.FileSystemObject");
var f = fs.GetFolder(".");

//すべてのサブフォルダを表示
var subfc = new AxEnum(f.SubFolders);
for(; !subfc.atEnd(); subfc.moveNext())
    alert("[" + subfc.item().Name + "]");

//すべてのファイルを表示
var fc = new AxEnum(f.Files);
for(; !fc.atEnd(); fc.moveNext())
    alert(fc.item().Name);
  

AxEnum : プロパティ・関数・・・リスト
AxEnumコンストラクター AciveXオブジェクトの列挙オブジェクトを作成
atEndプロパティ 取り出し位置がラストかどうかを判定
item関数 現在位置の要素を取得
moveFirst関数 現在位置を先頭へ移動
moveNext関数 現在位置を次ぎ位置へ移動

AxEnum コンストラクター AxEnum...

AciveXオブジェクトの列挙オブジェクトを作成

new AxEnum( activex ) : AxEnum

引数
activex : ActiveX
コレクションを持つAciveXオブジェクトを指定指定します。
返値
コレクションの要素が取り出せれる列挙オブジェクトを返します。

atEnd 関数 AxEnum...

取り出し位置がラストかどうかを判定

axenum.atEnd() : Boolean

返値
取り出し位置がラストで要素が取り出せないなら、trueを返します。まだ位置がラストでなく要素が取り出せれば、falseを返します。

item 関数 AxEnum...

現在位置の要素を取得

axenum.item() : Any

返値
コレクションの現在位置の要素を返します。

moveFirst 関数 AxEnum...

現在位置を先頭へ移動

axenum.moveFirst() : void

moveNext 関数 AxEnum...

現在位置を次ぎ位置へ移動

axenum.moveNext() : void


AxEventSink クラス ...

ActiveXオブジェクトのイベントを扱うクラスです。 このクラスはコンストラクターを持っていません。
オブジェクトの作成は ActiveX.newEventSinkクラス関数で作成されます。

AxEventSink : プロパティ・関数・・・リスト
classNameプロパティ クラス名の取得
membersプロパティ イベントハンドラーの列挙
setHandler関数 イベントハンドラーの登録と削除
unAdvise関数 ActiveXオブジェクトからのイベント通信を切断

className プロパティ AxEventSink...

クラス名の取得

eventsink.className : String [ReadOnly]

解説
常に"AxEventSink"を返します。
var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
var eventSink = ActiveX.newEventSink(excel);
alert( eventSink.className );  //"AxEventSink"
  

members プロパティ AxEventSink...

イベントハンドラーの列挙

eventSink.members : Object

解説
AxEventSinkオブジェクトのイベントハンドラーを列挙するオブジェクトを返します。
var {ActiveX} = require("ole");

var excel = new ActiveX('Excel.Application');
var eventSink = ActiveX.newEventSink(excel);

for (var m in eventSink.members) {
 print(m + " => " + eventSink.members[m]);
}
/*
NewWorkbook => [id(1565)] function( [in] Workbook* Wb ) : void
SheetSelectionChange => [id(1558)] function( [in] IDispatch* Sh, [in] Range* Target ) : void
SheetBeforeDoubleClick => [id(1559)] function( [in] IDispatch* Sh, [in] Range* Target, [in,out] VARIANT_BOOL* Cancel ) : void
SheetBeforeRightClick => [id(1560)] function( [in] IDispatch* Sh, [in] Range* Target, [in,out] VARIANT_BOOL* Cancel ) : void
  ・
  ・
*/

setHandler 関数 AxEventSink...

イベントハンドラーの登録と削除

eventSink.setHandler( eventname, handler ) : Boolean 登録
eventSink.setHandler( default_handler ) : Boolean 登録
eventSink.setHandler( eventname ) : Boolean 削除

引数
eventname : String
登録または削除するイベント名
handler : Function
イベント名eventnameのイベントを処理する関数(イベントハンドラー)
default_handler : Function
eventSink.setHandler(...)で登録したイベント以外のイベントを処理する関数(デファルトイベントハンドラー)
返値
イベントハンドラーの登録または削除に成功したらtrueを返します。
AxEventSinkオブジェクト(eventSink)が扱うイベントインターフェースにイベント名(eventname)の関数が存在しないなどで、登録,削除に失敗したらfalseを返します。
解説
イベント名eventnameのイベントを処理する関数(イベントハンドラー)の引数情報は、 eventSink.members[eventname]を表示すれば分かります。
しかし、デファルトイベントハンドラーは不特定のイベントを処理する関数なので、 第一引数にイベント名を渡します。第二引数の後にイベント固有の引数が続きます。
デファルトイベントハンドラーの削除方法は、eventSink.setHandler("")またはeventSink.setHandler()を実行してください。
var {ActiveX} = require("ole");

var excel = new ActiveX('Excel.Application');
excel.Visible = true;

var eventSink = ActiveX.newEventSink(excel);

alert( eventSink.members["NewWorkbook"] ); // [id(1565)] function( [in] Workbook* Wb ) : void
alert( eventSink.members["SheetBeforeDoubleClick"] ); // [id(1559)] function( [in] IDispatch* Sh, [in] Range* Target, [in,out] VARIANT_BOOL* Cancel ) : void

eventSink.setHandler("NewWorkbook",
 function(wb) { // Workbookが新規に作成すると呼ばれる
   // wb : Workbook
   alert( "new Workbook" );
   cnt++;
   if (cnt==3) ActiveX.cancelWaitEvents(); // 3個新しいWorkbookが作成されたら、イベント待ちをcancelする
 }
);

eventSink.setHandler(
 function(eventname) { // デファルトイベントハンドラー
   // eventname : String
   if (eventname.toLowerCase()=="sheetbeforedoubleclick") {
     // 
     // sheet = arguments[1] : ActiveX Sheetオブジェクト
     // range = arguments[2] : Range クリックセル位置
     // cancel= arguments[3] : AxVar Bool参照型
     var cancel = arguments[3]
     cancel.set(true); // Excelにダブルクリックの処理をさせないために cancelにtrueをセット
   }
 }
);

ActiveX.waitEvents(60*1000); // 一分間イベント待ち
                //すべてのAxEventSinkオブジェクトがunAdvise()するか、
                // ActiveX.cancelWaitEvents()が実行されたら、このイベント待ちを終了する

eventSink.setHandler("NewWorkbook"); // イベントNewWorkbookのイベントハンドラーを削除
eventSink.setHandler(""); // デフォルトイベントハンドラーを削除

unAdvise 関数 AxEventSink...

ActiveXオブジェクトからのイベント通信を切断

eventSink.unAdvise()

var {ActiveX} = require("ole");

var excel = new ActiveX("Excel.Application");
excel.Visible = true;

var cnt = 0;
var eventSink = ActiveX.newEventSink(excel); // =ActiveX.newEventSink(excel,"AppEvents");
eventSink.setHandler("NewWorkbook",
 function(wb) { // Workbookが新規に作成すると呼ばれる
   // wb : Workbook
   alert( "new Workbook" );
   cnt++;
   if (cnt==3) eventSink.unAdvise(); // 3個新しいWorkbookが作成されたら、eventSinkでのイベント待ちをoffにする
 }
);

ActiveX.waitEvents(); // イベント待ち
                //すべてのAxEventSinkオブジェクトがunAdvise()するか、
                // ActiveX.cancelWaitEvents()が実行されたら、このイベント待ちを終了する


AxVar クラス ...

AxVarクラスは、ActiveXオブジェクトのメソッド呼び出しにおいて、引数に値がセットされる参照引数や、配列のやり取りを実現してくれます。

参照引数
ActiveXオブジェクトの関数には、引数へ実行結果がセットされることがあります。このような引数を参照引数と呼んでいます。

参照引数であるかどうかを知るには、ActiveXオブジェクトの説明マニュアルを調べるか、ActiveXオブジェクトのmembersプロパティを使って調べれます。
たとえば、

  cadobj.members.abcLine2
  ==>
  [id(55)] function( [in] double x1, [in] double y1, [in] double x2, [in] double y2, [out] double* a, [out] double* b, [out] double* c ) : VARIANT_BOOL

cadobj.abcLine2(...)の[out]属性付きの第5~7引数が参照引数です。

参照引数の作り方は、AxVar(...)関数に型名と[]を渡して実行すれば出来上がります。

  var a = AxVar("double",[]);
  var b = AxVar("double",[]);
  var c = AxVar("double",[]);

  cad.abcLine2(0,0,5,12,a,b,c);

参照引数から値を取り出す方法は、$プロパティで値を得ることができます。

  alert( a.$ ); //-0.9230769230769231
  alert( b.$ ); // 0.38461538461538464
  alert( c.$ ); // 0


配列のやり取り
ActiveXオブジェクトの関数の引数に、Array型の配列を渡しても正しく受け付けてくれません。AxVarクラスで配列を定義すれば、配列の引数を渡せます。

配列引数であるかどうかを知るには、参照引数とおなじようにActiveXオブジェクトの説明マニュアルを調べるか、ActiveXオブジェクトのmembersプロパティを使って調べれます。
たとえば、

  matlab.members.PutFullMatrix
  ==>
  [id(1610678273)] function( [in] BSTR Name, [in] BSTR Workspace, [in] SAFEARRAY(double) pr, [in] SAFEARRAY(double) pi ) : void

matlab.PutFullMatrix(...)のSAFEARRAY付きの第3~4引数は配列引数です。

  matlab.members.GetFullMatrix
  ==>
  [id(1610678272)] function( [in] BSTR Name, [in] BSTR Workspace, [in,out] SAFEARRAY(double)* pr, [in,out] SAFEARRAY(double)* pi ) : void

matlab.GetFullMatrix(...)の[out]SAFEARRAY付きの第3~4引数は参照・配列引数です。


配列引数の作り方は、AxVar(...)関数に型名と[配列の大きさ]を渡して実行すれば出来上がります。

  var iReal = AxVar("double",[4,4]);
  var iImag = AxVar("double",[4,4]);
  for (var i=0; i<4; ++i) {
    for (var j=0; j<4; ++j) {
      iReal(i,j).$ = Math.sin(10*i+j);
      iImag(i,j).$ = Math.cos(10*i+j);
    }
  }
  matlab.PutFullMatrix("M","base",xReal,xImag);

  var oReal = AxVar("double",[4,4]);
  var oImag = AxVar("double",[4,4]);
  matlab.GetFullMatrix("M","base",oReal,oImag);

配列引数から値を取り出$す方法は、配列引数を(index1,index2)で関数のように実行すれば値を得ることができます。配列引数に値を設定するには既に上記の例のように 配列引数(index1,index2).$ = 値 でOKです。

alert( iReal(2,3).$==oReal(2,3).$ ); //true
alert( iImag(2,3).$==oImag(2,3).$ ); //true


AxVar : プロパティ・関数・・・リスト
classNameプロパティ クラス名の取得
vtype, vtプロパティ 格納されている値の型
AxVarコンストラクター・関数 AxVarオブジェクトを作成
attach関数 AxVarオブジェクトをアタッチ/td>
changeType関数 格納されている値の型を変更
clear関数 中身を空にする
copy, clone関数 同じ中身を持つAxVarオブジェクトを作成
detach関数 AxVarオブジェクトをデタッチ
dim関数 中身を配列にする
get関数 v=axvar(...).$ 中身をget
getActiveX関数 ActiveX型に変換した値をget
getBool関数 Boolean型に変換した値をget
getDate関数 Date型に変換した値をget
getDbl関数 double型に変換した値をget
getInt関数 Integer型に変換した値をget
getStr関数 String型に変換した値をget
redim関数 配列のサイズを変更
set関数 axvar(...).$=v 値をset
__ptr__, __rawAddress__関数 axvar(...).$=v AxVarのCポインター(VARIANT*)を取得

className プロパティ AxVar...

クラス名の取得

axvar.className : String [ReadOnly]

解説
常に"AxVar"を返します。
var {AxVar} = require("ole");

var axvar = new AxVar();
alert( axvar.className );  //"AxVar"
  

vtype プロパティ AxVar...

格納されている値の型

axvar.vtype : Array [ReadOnly]
axvar.vt : Integer [ReadOnly]

解説
vtypeプロパティは、値の型情報を [基本型名] or [基本型名,[配列サイズ]] 配列表現します。
vt プロパティは、型番号 追加情報(+修飾子番号) です。

基本型名

型名型番号JavaScript型C, C++型
boolAxVar.VT_BOOLBooleanbool
shortAxVar.VT_I2Numbershort
intAxVar.VT_I4Numberint
longAxVar.VT_I4Numberlong
floatAxVar.VT_R4Numberfloat
doubleAxVar.VT_R8Numberdouble
dateAxVar.VT_DATEDateDATE
stringAxVar.VT_BSTRStringwchar_t[]
activexAxVar.VT_DISPATCHActiveXIDispatch*
variantAxVar.VT_VARIANTAxVarVARIANT
charAxVar.VT_I1Numberchar
ucharAxVar.VT_UI1Numberunsigned char
ushortAxVar.VT_UI2Numberunsigned short
uintAxVar.VT_UI4Numberunsigned int
ulongAxVar.VT_UI4Numberunsigned long
longlongAxVar.VT_I8Numberlong long
ulonglongAxVar.VT_UI8Numberunsigned long long
voidAxVar.VT_VOIDvoid?
nullAxVar.VT_NULLnull?
emptyAxVar.VT_EMPTY??

型追加情報

追加名追加番号JavaScriptC, C++
配列AxVar.VT_ARRAY[][]
参照ポインターAxVar.VT_BYREF?&

[配列サイズ]
  [ [ B, N ] ] --- 添え字の下限値 B, サイズ N の 1次元配列
  [ [ B1, N1 ], [ B2, N2 ] ] --- 添え字の下限値 B1, b2, サイズ N1 x N2 の 2次元配列

var {AxVar} = require("ole");

var v1 = AxVar();
print( v1.vtype.toSource()); //["empty"]
print( v1.vt.toString(16));  // 0
print( v1.vt==AxVar.VT_EMPTY);  // true

var v2 = AxVar("int",[]);
print( v2.vtype.toSource()); //["long"]
print( v2.vt.toString(16));  // 3
print( v2.vt==AxVar.VT_I4);  // true

var v3 = AxVar(23.5);
print( v3.vtype.toSource()); //["double"]
print( v3.vt.toString(16));  // 5
print( v3.vt==AxVar.VT_R8);  // true

var v4 = AxVar("double",[100]);
print( v4.vtype.toSource()); //["double", [[0, 100]]]
print( v4.vt.toString(16));  // 2005
print( v4.vt==(AxVar.VT_R8|AxVar.VT_ARRAY));  // true
   

AxVar コンストラクター・関数 AxVar...

AxVarオブジェクトを作成

値の格納
axvar = new AxVar() : AxVar
axvar = new AxVar( value ) : AxVar

参照引数の作成
axvar = new AxVar( type, [] ) : AxVar
axvar = AxVar( type, [] ) : AxVar
axvar = new AxVar( type, [], value ) : AxVar
axvar = AxVar( type, [], value ) : AxVar

配列の作成
axvar = new AxVar( type, [size, ...] ) : AxVar
axvar = AxVar( type, [size, ...] ) : AxVar

引数
value : Any
AxVarオブジェクトに格納する値
type : String or Integer
AxVarオブジェクトに格納する値の型名
指定できる型名は,
short, long, int, float, double, date, string, activex, bool, variant, char, uchar, ushort, ulong, uint, longlong, ulonglong, void, null
です。空文字列 "" は、"variant"と内部的に解釈します。

AxVarオブジェクトに格納する値の型番号
指定できる型番号は,
AxVar.VT_***
VT_I2, VT_I4, VT_R4, VT_R8, VT_DATE, VT_BSTR, VT_DISPATCH, VT_BOOL, VT_VARIANT, VT_I1, VT_UI1, VT_UI2, VT_UI4, VT_I8,VT_UI8, VT_VOID, VT_NULL
size, ... : Integer or Array, ...
配列のサイズ、添え字の下限値を指定します。
size = N のとき、添え字の下限値0, サイズNの配列を指定
size = [B,N] のとき、添え字の下限値B, サイズNの配列を指定
size, ... = N1, N2 のとき、添え字の下限値0, サイズ N1 x N2 の配列を指定
size, ... = [B,N1], [B,N2] のとき、添え字の下限値B, サイズ N1 x N2 の配列を指定
返値
作成したAxVarオブジェクトを返します。
参照
vtype, vt
var {ActiveX, AxVar} = require("ole");

var word = new ActiveX("Word.Application");
word.Documents.Add();
word.Visible = true;

var window = word.ActiveWindow;
alert( window.members.GetPoint ); // [id(112)] function( [out] long* ScreenPixelsLeft, [out] long* ScreenPixelsTop, [out] long* ScreenPixelsWidth, [out] long* ScreenPixelsHeight, [in] IDispatch* obj ) : void


var left = AxVar("long",[]);
var top = AxVar("long",[]);
var width = AxVar("long",[]);
var height = AxVar("long",[]);

window.GetPoint(left,top,width,height,word.Selection.Range)

alert( left.$ );
alert( top.$ );
alert( width.$ );
alert( height.$ );

attach 関数 AxVar...

AxVarオブジェクトをアタッチ

axvar.attach(index, axvarSource ) : Boolean
axvar.attach(axvarSource ) : Boolean

引数
index : Integer or Array
axobjが配列である場合、アタッチしたい配列要素をインデックスで指定します。
引数indexを与えなければ、axobj自身がaxvarSourceでアタッチされます。
axvarSource : AxVar
アタッチするAxVarオブジェクト
返値
アタッチに成功したら trueを返し、axvarSourceの中身はアタッチ先に移動し、axvarSourceの中身は空になります。
失敗したらfalseを返します。
参照
detach関数
var {AxVar} = require('ole');

var a = new AxVar("variant",3);
var b = new AxVar("int", 5);
b(3).$ = 123;
a.attach(2,b);

print(a(2)(3).$);  // 123

a(2)(3).$ = -321;

b = a.detach(2)

print(b(3).$);  // -321

changeType 関数 AxVar...

格納されている値の型を変更

axvar.changeType( type ) : Boolean

引数
type : String or Integer
変更したい型名。
使える型名はAxVarコンストラクターの引数(typename)を参照
返値
型変更に成功したら trueを返します。型変更できなかったら falseを返します。
参照
vtype, vt

clear 関数 AxVar...

中身を空にする

axvar.clear()

解説
このオブジェクトの中身を後始末して、中身を空にします。

copy, clone 関数 AxVar...

同じ中身を持つAxVarオブジェクトを作成

axvar.copy()
axvar.clone()
返値
axvarと同じ中身を持つAxVarオブジェクトを返します。

解説
copy, clone 関数は、同じ中身を持つ別のAxVarオブジェクトを作成します。したっがて、片方の中身を(set関数などで)変更しても、もう片方のオブジェクトの中身は変更されません。
var {AxVar} = require("ole");

var v1 = AxVar(1234);
var v1_ = v1;
var v2 = v1.copy();

alert( v1().$ ); // 1234
alert( v1_().$ ); // 1234
alert( v2().$ ); // 1234

v1().$ = 4321; // v1 の中身を変更
alert( v1().$ ); // 4321
alert( v1_().$ ); // 4321
alert( v2().$ ); // 1234

detach 関数 AxVar...

AxVarオブジェクトをデタッチ

axvar.detach(index) : AxVar

引数
index : Integer or Array
axobjが配列である場合、デタッチしたい配列要素をインデックスで指定します。
引数indexを与えなければ、axobj自身がデタッチされます。
返値
デタッチされた中身を含むAxVarオブジェクトが返されます。
参照
attach関数

dim 関数 AxVar...

中身を配列にする

axvar.dim( type, [size, ...] )

引数
type : String or Integer
配列要素の型名
指定できる型名は,
short, long, int, float, double, date, string, activex, bool, variant, char, uchar, ushort, ulong, uint, longlong, ulonglong
です。空文字列 "" は、"variant"と内部的に解釈します。

配列要素の型番号
指定できる型番号は,
AxVar.VT_***
VT_I2, VT_I4, VT_R4, VT_R8, VT_DATE, VT_BSTR, VT_DISPATCH, VT_BOOL, VT_VARIANT, VT_I1, VT_UI1, VT_UI2, VT_UI4, VT_I8,VT_UI8, VT_VOID, VT_NULL
size, ... : Integer or Array, ...
配列のサイズ、添え字の下限値を指定します。
size = N のとき、添え字の下限値0, サイズNの配列を指定
size = [B,N] のとき、添え字の下限値B, サイズNの配列を指定
size, ... = N1, N2 のとき、添え字の下限値0, サイズ N1 x N2 の配列を指定
size, ... = [B,N1], [B,N2] のとき、添え字の下限値B, サイズ N1 x N2 の配列を指定
参照
vtype, vt
var {AxVar} = require("ole");

var a = new AxVar(); // var a = AxVar();
a.dim("double",[4,4]); // 要素の型は double型で、添え字の下限値0, サイズ 4x4 の配列
/*
上記2行は
var a = new AxVar("double",[4,4]); // var a = AxVar("double",[4,4]);
と同じです。
*/

a(2,3).$ = 1000;
alert( a(2,3).$ ); // 1000

get 関数 v=axvar(...).$ AxVar...

中身をget

中身が配列でないとき
v = axvar.get()
v = axvar.$
v = axvar().$
中身が配列であるとき
v = axvar.get(index, ...)
v = axvar(index, ...).$

引数
index, ... : Integer, ...
配列のインデックス番号
返値
AxVarオブジェクトの中身を返します。配列の場合にはインデックス番号に対応した値を返します。
解説
$プロパティより、get関数の方が若干アクセスspeedが速い.
var {AxVar} = require("ole");

var s = new AxVar("ABC"); // var s = AxVar("ABC");
alert( s.get() ); // ABC
alert( s.$ ); // ABC
alert( s().$ ); // ABC

var a = new AxVar("double",[4,4]); // var a = AxVar("double",[4,4]);
a(2,3).$ = 1000;

alert( a.get(2,3) ); // 1000
alert( a(2,3).$ ); // 1000

参照
set, axvar(...).$=v

getActiveX 関数 AxVar...

ActiveX型に変換した値をget

axvar.getActiveX() : ActiveX

返値
変換した値 ActiveXオブジェクトを返します。

getBool 関数 AxVar...

Boolean型に変換した値をget

axvar.getBool() : Boolean

返値
変換した値 Bool値を返します。

getDate 関数 AxVar...

Date型に変換した値をget

axvar.getDate() : Date

返値
変換した値 Date値を返します。

getDbl 関数 AxVar...

double型に変換した値をget

axvar.getDbl() : Number

返値
変換した値 double値を返します。

getInt 関数 AxVar...

Integer型に変換した値をget

axvar.getInt() : Integer

返値
変換した値 Int値を返します。

getStr 関数 AxVar...

String型に変換した値をget

axvar.getStr() : String

返値
変換した値 String値を返します。

redim 関数 AxVar...

配列のサイズを変更

axvar.redim( N ) : Boolean axvar.redim( [ B, N ] ) : Boolean

引数
N : Integer
配列の最後次元(右端)を添え字の下限値0、サイズN。
[ B, N ]: [Integer, Integer]
配列の最後次元(右端)を添え字の下限値B、サイズN。
返値
配列の最後次元(右端)を引数で指定したサイズに変更できたらtrueを返します。サイズ変更に失敗したら falseを返します。
var {AxVar} = require("ole");

var a = new AxVar("double",[4,4]); // var a = AxVar("double",[4,4]);
alert( a.vtype.toSource() );	//["double", [[0, 4], [0, 4]]]
a(3,3).$ = -1234;

a.redim([1,10]);
alert( a.vtype.toSource() );	//["double", [[0, 4], [1, 10]]]
alert( a(3,4).$ ); // -1234   旧index(3,3) ==> 新index(3,4) は同じ位置

set 関数 axvar(...).$=v

値をset

中身が配列でないとき
axvar.set(v)
axvar.$ = v
axvar().$ = v
中身が配列であるとき
axvar.set(index, ..., v)
axvar(index, ...).$ = v

引数
v
setする値
index, ... : Integer, ...
配列のインデックス番号
解説
$プロパティより、set関数の方が若干アクセスspeedが速い.
axvar.vtype == ["&typename[...]", [[lowbound,count]...]]とtypenameの前後に&,[...]が付いている場合、値 v をtypename型に型変換してsetされます。
var {AxVar} = require("ole");

var H = AxVar(); // var H = new AxVar();
H.set("175.5cm"); // H.$ = "175.5cm"; または H().$ = "175.5cm";

alert( H.$ ); // 175.5cm
参照
get, v=axvar(...).$

__ptr__, __rawAddress__ 関数 AxVar...

AxVarのCポインター(VARIANT*)を取得

axvar.__ptr__() : ctypes.voidptr_t
axvar.__rawAddress__() : ctypes.voidptr_t

返値
AxVarのCポインター(VARIANT*)が返される。

ComObj クラス ...

COMオブジェクトを扱うクラスです。
COMオブジェクトは、インターフェースポインタとそのインターフェースGUIDを含んだオブジェクトであり、生のアドレスポインタが取得できます。
これにより、C,C++と連携できることを可能にしています。
他のインターフェースを備えていれば、QueryInterfaceメソッド関数でそのインターフェースポインタを含んだComObjオブジェクトが取得できます。 <

AxA : 関数,メソッド・・・リスト
ComObjコンストラクト関数 生のアドレスポインタとGUIDからComObjオブジェクトを作成
equal_guidメソッド関数 ComObjオブジェクトが持つGUIDが指定GUIDと同じかを判定
QueryInterfaceメソッド関数 ComObjオブジェクトから指定GUIDのインターフェースポインタを取得
guidプロパティ ComObjオブジェクトのGUIDを取得(Cデータ)
guid_strプロパティ ComObjオブジェクトのGUID文字列を取得
__p__プロパティ ComObjオブジェクトのインターフェースポインタを取得(Cポインター)
make_guid_str関数 任意にGUID文字列を作成

ComObj コンストラクター ComObj...

生のアドレスポインタとGUIDからComObjオブジェクトを作成

new ComObj( addrese, guid ) : ComObj
new ComObj( comobj, guid ) : ComObj

引数
address : String
Cポインターを16進数表記した文字列
C言語プログラムで、printf("%p", cpointer); が表示する文字列(例、"0053F9F4")。
comobj : ComObj
ComObjオブジェクト
guid : String または GUID(Cデータ)
COMインターフェースに名付けられたGUIDは、GUIDはCデータは16バイトのデータです。
GUIDの文字列化は このデータを16進数表記した "a8d7ab05-fba6-4934-82f7-ccde10aaebb0" のようなものです。
COMの世界で良く知られたCOMインターフェースのGUIDを例に出します。
IUnknownインターフェース : "00000000-0000-0000-c000-000000000046"
IDispatchインターフェース: "00020400-0000-0000-c000-000000000046"
返値
作成したComObjオブジェクトを返します。
GUIDに対応したCOMインターフェースポインタが無ければ、エラーが発生します。

equal_guid メソッド関数 ComObj...

ComObjオブジェクトが持つGUIDが、指定GUIDと同じかを判定

comobj.equal_guid( guid ) : Boolean

引数
guid : String または GUID(Cデータ)
COMインターフェースに名付けられたGUIDは、GUIDはCデータは16バイトのデータです。
GUIDの文字列化は このデータを16進数表記した "a8d7ab05-fba6-4934-82f7-ccde10aaebb0" のようなものです。
返値
comobjが持つインターフェースGUIDと引数のguidが同じなら、trueを返します。
違えば、falseを返します。

QueryInterface メソッド関数 ComObj...

ComObjオブジェクトから指定GUIDのインターフェースポインタを取得

comobj.QueryInterface( guid ) : Boolean

引数
guid : String または GUID(Cデータ)
COMインターフェースに名付けられたGUIDは、GUIDはCデータは16バイトのデータです。
GUIDの文字列化は このデータを16進数表記した "a8d7ab05-fba6-4934-82f7-ccde10aaebb0" のようなものです。
返値
comobjに指定したインターフェースGUIDがあれば、そのインターフェースポインタとGUIDを含んだComObjオブジェクトを返します。
なければ、nullを返します。

guid プロパティ ComObj...

ComObjオブジェクトのGUIDを取得(Cデータ)

comobj.guid : GUID (Cデータ) ReadOnly


guid_str プロパティ ComObj...

ComObjオブジェクトのGUID文字列を取得

comobj.guid_str : String ReadOnly


__p__ プロパティ ComObj...

ComObjオブジェクトのインターフェースポインタを取得(Cポインター)

comobj.__p__ : Cデータポインター ReadOnly


make_guid_str 関数 ComObj...

任意にGUID文字列を作成

ComObj.make_guid_str() : String

返値
任意に作成されたGUIDを文字列化したものを返します。
注意
make_guid_str関数から得たGUIDは任意で、COMインターフェースと意味づけされてないため、上記のメソッド関数の引数に渡しても意味がありませし、失敗またはエラーが発生します。
この関数の結果は、任意の時間、世界中のどのGUID作成関数で作ったGUIDと一致しないことが保証されてるアルゴリズムで作成されたものだと言われています。

axa, axserverとaxclientモジュールを使ったプロセス間通信[...]

axserverモジュールとaxclientモジュールを使えば、柔軟なプロセス間通信が簡単に実現できます。
axserverモジュールはサーバーサイドのプログラム、axclientモジュールはクライアントサイドのプログラムを作成するためのライブラリーを提供します。
サーバー, クライアントは別々プロセスで動き、互いにメソッドcallしてサービスの授受やデータ交換ができます。

axaモジュールは、サーバーとクライアント両方のサイドで使います。

次の説明図は、サーバーサイドのJSプログラムを起動した後、
クライアントサイドのJSプログラムを起動しサーバーにある「add」サービスを呼び出しその結果をprint関数で表示しています。
simple_axsv.js, simple_axcli.js


Python言語では以下のように記述します。
ただし、Pythonにはメッセージループを持たないので追加処理があります。
simple_axsv.py, simple_axcli.py


実行方法は、最初にサーバーサイドを実行した後、クライアントサイドを実行します。
また逆に、クライアントサイドを先に起動し、10秒以内にサーバーサイドを実行しても正しく動作します。

さらにサーバーサイドとクライアントサイドは、JavaScript, Pythonどちらの言語の組み合わせであっても正しく動作します。

サーバーサイドは、axserverモジュールにある関数やクラスを使って実装できます。
そのモジュールには、サーバー本体のAXserverオブジェクト、サービス関数動作中のcontextであるAXcontextオブジェクトが準備されている。

クライアントサイドは、axclientモジュールにある関数やクラスを使って実装できます。
そのモジュールには、クライアント本体のAXclientオブジェクト、サービスを受け取るときに必要なAXreceiverオブジェクトが準備されている。

サーバーサイドの実装 実装スクリプトogo_server.js, ogo_server.py...

  1. 準備(AXサーバーブジェクト作成関数(newAX)、削除関数(delAX)をAXsvモジュールから取り出す)
  2.       var axserver = require('axserver');
          var axa = require('axa');
        
  3. AXオブジェクト作成
  4.       var axsv = axserver.newAX("SAMPLE");
        
  5. インターフェス定義
  6.       //加算
          axsv.on("add",
            function(a, b) { //呼出名"add"とその実行関数、それに説明文を追加
              return a + b;
            },
            "ans = a + b" //"add"処理の説明
          );
          
          //素数
          axsv.on("prime",
            function(N, delay=0) { //呼出名"prime"とその実行関数, 非同期で処理する
                var axcx = this;
                var n = 2;        //素数であるか最初に調べる数
                var primes = [];  //見つけた素数を配列に入れる
                
                delay = 0 | delay;  
                setTimeout(my_find_prime, delay);
                
                function my_find_prime() {
                    if (n>N) {
                      axcx.close();
                      return;
                    }
                    var primed = true;
                    for (var j=0; j<primes.length; j++) {
                        if ((n%primes[j])==0) {
                            primed = false;
                        }
                    }
                    if (primed) {
                        primes.push(n);
                        axcx.returnVals(primes.length, n);
                    }
                    n += 1;
                    setTimeout(my_find_prime, delay);
                }
            },
            "[p-]prime(N, delay=0)"   //[p-]は、クライアントからのpost呼出で サーバーから何度もaxcx.returnVals(...)を使って値を返すことを可能にします。
          );
               
  7. メッセージループ
  8.       axa.msgLoop(); //アプリよって、メッセージループの書き方が違う
        

クライアントサイドの実装 実装スクリプトogo_client.js, ogo_client.py...

  1. 準備(AXクライアントオブジェクト取得関数(getoutAX)を axclientモジュールから取り出す)
  2.       var axa = require('axa');
          var {getoutAX} = require('axclient');
        
  3. AXクライアントオブジェクトを取得)
  4.       var axcli = getoutAX("SAMPLE");  //サーバーサイトで名前”SAMPLE"で作成されたオブジェクト
        
  5. "add"サービスをsend関数(同期)で呼び出す
  6.       alert( axcli.send("add", 20, 50) );  //  70
        
  7. axcliの"prime"サービスをpost関数で呼び出し、値を非同期に返す
  8.       axcli.rcvr(
            function(name, count, n) {
              print(`[${count}] ${n}`);
            }
          ).post("prime", 50, 100) );  // 50以下の整数リストを 100ミリ秒毎に計算
          
          axa.msgLoop(5*1000); // 5秒間、上記の計算を受け取るためのメッセージループ
          /*
          [1] 2
          [2] 3
           ・
           ・
          [14] 43
          [15] 47
          */
        
  9. サーバーを終了
  10.       axcli.close();
        
  11. クライアントを終了
  12.       axa.exit();
        
axa, axserverとaxclient モジュール・・・リスト
axa モジュール
newAxA関数ActiveXオブジェクト共有化をサポートオブジェクトを取得
msgLoop関数メッセージループ処理
breakLoop関数メッセージループを終わらせる
exit関数アプリを終わらせる
launchコンストラクターアプリを起動
make_guid_str関数ユニークGUIDを作成
axserver モジュール
newAX関数AXサーバーオブジェクトを作成
delAX関数AXサーバーオブジェクトを削除
getAX関数AXサーバーオブジェクトを取得
exit関数AXサーバーオブジェクトをすべて削除しサーバーを終了
AXserverクラスAXサーバーオブジェクトのクラス
AXcontextクラスAXサーバーのサービス関数でのcontextクラス
axclient モジュール
getoutAX関数AXクライアントオブジェクトを取り出す
AXclientクラスAXクライアントオブジェクトのクラス
AXreceiverクラス非同期サービス受取オブジェクトのクラス


[axa]axaモジュール...

newAxA 関数 axaモジュール...

ActiveXオブジェクト共有化をサポートオブジェクトを取得

var {newAxA} = require('axa');
newAxA() : OgOx.AxA

返値
OgOx.AxA AciveXオブジェクトを返します。
解説
newAxA関数が返すOgOx.AxA AciveXオブジェクトを使えば、
2つのプロセス間で、ActiveXオブジェクトを共有できます。
AXサーバーとAXクライアント間の通信は、OgOx.AxA AciveXオブジェクトを仲介して行われます。
以下は、[A]プロセスでセットした値を [B]プロセスが読み込む例です。

//[A]プロセス
var {ActiveX} = require("ole");
var {newAxA} = require('axa');

var axa = newAxA();

var excel = new ActiveX('Excel.Application');
excel.Visible = true;

axa.reg("EXCEL_TEST", excel);

var book = excel.Workbooks.Add();
var sheet1 = book.Sheets('sheet1');

sheet1.Cells(1,!).$ = 1234;	//[★]

---------------------------------------------
//[B]プロセス
var {newAxA} = require('axa');

var axa = newAxA();

var excel = axa.getout("EXCEL_TEST");	//このexcelは、[A]プロセスで作成されたActiveXオブジェクト

var book = excel.Workbooks('Book1');
var sheet1 = book.Sheets('sheet1');

alert( sheet1.Cells(1,1).$ ); 	//1234  [★]で入力した値!!!

msgLoop 関数 axaモジュール...

メメッセージループ処理

var {msgLoop} = require('axa');
msgLoop(msec=-1)

引数
msec
メッセージループ処理時間(ミリ秒)を指定
-1または引数を省略した場合、breakLoop関数の実行やアプリの流れを変える操作が行われると、このループ処理を終えます。
返値
なし

breakLoop 関数 axaモジュール...

メッセージループを終わらせる

var {breakLoop} = require('axa');
breakLoop(deep=1)

引数
deep
msgLoop関数を再起呼出された場合、その呼出回数のメッセージループを終わらす回数(deep)を指定します。
CAD-FTRの場合、msgLoop関数を再起呼出ことができないので、この引数は無視されます。
省略した場合、1を渡します。
返値
なし

exit 関数 axaモジュール...

アプリを終わらせる

var {exit} = require('axa');
exitLoop(f=0)

引数
f
アプリが終了時、プロセスが返す値を指定します。
省略した場合、0を渡します。
返値
なし

launch 関数 axaモジュール...

アプリを起動

var {launch} = require('axa');
launch(exeprogname, param=null, curdir=null, showCmd=0) : HINSTANCE

引数
exeprogname
実行プログラム名(パス名)
param
実行プログラムに渡す引数文字列
curdir
プログラムが実行されたときのカレントファオルダー
showCmd
0なら、Windowを非表示で起動
1なら、通常のWindowサイズをアクティブにして起動
Windowsプログラム定数(SW_HIDE=0, SW_SHOWNORMAL=1, SW_SHOWMINIMIZED=2,SW_SHOWMAXIMIZED=3, ...)
返値
Windowsプロセスインスタンス(WIN32 APIで HINSTANCEとtypedefされている)を返します。
失敗したら,0を返します・

make_guid_str 関数 axaモジュール...

ユニークGUIDを作成

var {make_guid_str} = require('axa');
make_guid_str() : String

返値
作成されたユニークGUIDを文字列として返します。
次のようなフォーマット文字列 : 3F2504E0-4F89-11D3-9A0C-0305E82C3301


[axserver]axserverモジュール...

newAX 関数 axserverモジュール...

AXサーバーオブジェクトを作成

var {newAX} = require('axserver');
newAX(name, refcount=1) : AXserver

引数
name
サーバー名
セキュリティ上わかりずらい名前にするにはは、make_guid_str関数を使用します。
refcount
クライアント数
返値
AXサーバーオブジェクトを返します。
解説
この作成されたAXサーバーオブジェクトにはまだサービスは組み込まれていません。
そのためサービスは、onメソッド関数を使って組み込みます。

AXサーバーに対するAXクライアントは、axclientモジュールのgetoutAX関数で取得できます。
// [サーバ] 側
//AXサーバーオブジェクト作成とサービスの組み込み
var {newAX} = require('axserver');

var axsv = newAX("SAMPLE");

axsv.on("add",
	function(a, b) {
		return a + b;
	},
	"ans = a + b"
);

------------------------------------------
// [クラアント] 側
//AXクライアントを取得してサービスを受ける
var {getoutAX} = require('axclient');

var axcli = getoutAX("SAMPLE");

print( axcli.send("add", 20, 50) );	//70

delAX 関数 axserverモジュール...

AXサーバーオブジェクトを削除

var {delAX} = require('axserver');
delAX(name) : Boolean

引数
name
サーバー名
返値
AXサーバーオブジェクトが削除に成功したら、trueを返します。
失敗したら、falseを返します。

getAX 関数 axserverモジュール...

AXサーバーオブジェクトを取得

var {getAX} = require('axserver');
getAX(name) : AXserver

引数
name
サーバー名
返値
引数 nameのAXサーバーオブジェクトがまだ削除されていなければ、そのAXサーバーオブジェクトを返します。
なければ、nullを返します。

exit 関数 axserverモジュール...

AXサーバーオブジェクトをすべて削除しサーバーを終了

var {exit} = require('axserver');
exit(f)

引数
f : Integer
サーバーアプリプロセスが終了したときに返す値
解説
AXサーバーオブジェクトの削除とサーバーアプリの終了は非同期で処理されます。そのため、exit関数の呼び出しはすぐに終了し その後、サーバーアプリがidling状態中に目的の処理がされて最後ににサーバーアプリが終了します。


[axclient]axclientモジュール...

getoutAX 関数 axclientモジュール...

AXクライアントオブジェクトを取り出す

var {getoutAX} = require('axclient');
getoutAX(name) : AXclient

引数
name
サーバー名
返値
引数 nameのAXサーバーに対するAXクライアントオブジェクトを返します。
なければ、nullを返します。

AXserver クラス ...

AXサーバーの実装は、newAX関数を呼び出して返されたブジェクトを使ってできます。
このオブジェクトはAXseverクラスのインスタンスです。 提供するサービスは、onメソッド関数を使って登録します。

そして、サービスを受け取るAXクライアントからこれらのサービスを同期(sendメソッド関数)、非同期(postメソッド関数)で呼び出せます。

以下、AXサーバーの実装を簡単に説明します。
  1. AXサーバーの実装に必要なモジュールをロード
  2.     var axa = require('axa'); //AXサーバーとクライアントが通信するための補助ライブラリー
        var {newAX, delAX} = require('axserver'); //AXサーバーオブジェクトの作成と削除
      
  3. AXサーバーオブジェクトの作成
  4.     var axsv = newAX("SAMPLE"); //サーバー名は"SAMPLE"
      
  5. サービスの登録
  6.     axsv.on("add", //サービス名"add"
          function(a, b) { //サービスを実行する関数
            return a + b;
          },
          "ans = a + b" //サービスの説明
        );
      
  7. サービスできるようにするためのメッセージループ
  8.     axa.msgLoop();
      

AXserver : 補助関数・メソッド関数・・・リスト
on メソッド関数 サービス関数の登録
off メソッド関数 サービス関数の削除
returnState メソッド関数 クラアントにサーバーの状態を通知

on メソッド関数 ...

サービス関数の登録

axsv.on( callname, func[, description] ) : AXserver

引数
axsv : AXserver
AXserverオブジェクト
callname : String
call名
func : Function
call関数
description : String}
callnameの説明文字列
この文字列の先頭位置に[...]で囲んだ中にsend, postの呼出制限が指定できます。
[s,p] --- send, post関数で呼出が可能([...]省略した場合、この設定になります)
[s] --- send関数のみ呼出が可能
[p] --- post関数のみ呼出が可能
[p-] --- post関数のみ呼出が可能で、何度もthis.returnVals(...)を使って値を返すことが可能。そしてthis.close()でpost処理を終了となります。
返値
AXserverオブジェクト(axsv)を返します。
解説
AXオブジェクトのsend,postメソッド関数を呼び出すと、このonメソッド関数で組み込んだcall関数が呼ばれてきます。

call名は、先頭文字「」,「_」以外から始まる文字列を指定します。

call関数の仕様は、次のようになります。
  1. call名 が "*" でない場合
  2. function (a1, a2, a3, ...rest) { //引数の数は 0~8個 受け付けます。
        var axcontext = this; // AXcontextオブジェクト
        // axcontext.callname --- call名
        // axcontext.rindex   --- クライアント側でsendでcallされた場合 rindex=0、postメソッド関数では,呼び出される毎にインクリメントされた番号が設定されています。
        ・・・
        ・・・
        return value; // sendメソッド関数で呼び出された場合 この値を返します。postメソッド関数ではAXreceiverオブジェクトが非同期で値を受け取ります。
    }
            
  3. call名 == "*" の場合
  4. send,postメソッド関数のcall名が、onメソッド関数で登録したどれとも一致しないときに呼び出されるcall関数です。
    上記call関数に引数nameが先頭に追加されます。その他の引数、thisについては全く同じです。 function (name, a1, a2, a3, ...rest) { //引数の数はnameを除いて 0~8個 受け付けます。 var axcontext = this; // AXcontextオブジェクト // axcontext.callname --- call名(==name) // axcontext.rindex --- クライアント側でsendでcallされた場合 rindex=0、postメソッド関数では,呼び出される毎にインクリメントされた番号が設定されています。 ・・・ // 処理 ... ・・・ // 処理 ... ・・・ ・・・ return value; // sendメソッド関数で呼び出された場合 この値を返します。postメソッド関数ではAXreceiverオブジェクトが非同期で値を受け取ります。 }

次の2つのcall関数がデフォルトで最初から組み込まれています。
クライアント側で、このサーバーオブジェクトのサービスを知るために使えます。
  1. 説明文を取得するcall関数('?', call名)
  2. すべてのcall関数の説明文を取得するcall関数('??')

off メソッド関数 ...

サービス関数の登録

axsv.off( callname ) : AXserver

引数
axsv : AXserver
AXserverオブジェクト
callname : String
call名
返値
AXserverオブジェクト(axsv)を返します。
これで、callnameのサービスは呼び出すことができなくなります。

returnState メソッド関数 ...

クラアントにサーバーの状態を通知

axsv.returnState( state, a1, a2,... )

引数
axsv : AXserver
AXserverオブジェクト
state : String
状態名(除く "error", "close")
a1, a2,... (最大8個まで)
任意に値を状態名
返値
なし
解説
クライアント側でこの通知を受け取るには、AXclientオブジェクトのsetHandlerメソッド関数で受け取り関数を登録しておく必要があります。
// [サーバ] 側
//AXサーバーオブジェクト作成とサービスの組み込み
var {newAX} = require('axserver');

var axsv = newAX("SAMPLE");

axsv.on("add",
	function(a, b) {
		return a + b;
	},
	"ans = a + b"
);

・・・

axsv.returnState("ok!");

------------------------------------------
// [クラアント] 側
//AXクライアントを取得してサービスを受ける
var {getoutAX} = require('axclient');

var axcli = getoutAX("SAMPLE");

axcli.setHandler(
	function(state, ...rest) {
		if (state=="ok!") {
			print( axcli.send("add", 20, 50) );	//70
		}
	}
);


AXcontext クラス...

AXclientオブジェクトのpost, sendメソッド関数でサーバ側のcall関数が呼び出したとき、thisオブジェクトがAXcontextクラスです。

AXcontextオブジェクトの主な役目は、postメソッド関数でcall関数呼び出されたとき、クライアント側に非同期(複数の)結果を返すことです。
また、post, sendどちらのメソッド関数で呼び出されたかは、プロパティrindexで判断できます。

//[サーバー]
var axa = require('axa');
var {newAX} = require('axserver');

var axsv = newAX("SAMPLE");

//インターフェス定義
//加算
axsv.on("add",
  function(a, b) {
    return a + b;
  },
  "ans = a + b"
);

//素数(素数を非同期で返す)
axsv.on("prime",
  function(N) {
    var axcx = this;
    var n = 2;        //素数であるか最初に調べる数
    var primes = [];  //見つけた素数を配列に入れる

    for (var n=2; m<N; n++) {
      var primed = true;
      for (var j=0; j<primes.length; j++) {
        if ((n%primes[j])==0) {
          primed = false;
          break;
        }
      }
      if (primed) {
        primes.push(n);
        axcx.returnVals(primes.length, n);	//(count, 素数)
      }
    }
    //postによる最後のreturn
    axcx.close();	//または return "end";
  },
  "prime(N)" 
);

//メッセージループ
axa.msgLoop();

---------------------------------------------
//[クライアント]
var axa = require('axa');
var {getoutAX} = require('axclient');

var axcli = getoutAX("SAMPLE");

//"add"同期呼出
//print(axcli.send("add", 20, 50)); //70

//"add"非同期呼出
axcli.rcvr(
  function(name, ans, *rest) {
    print(`20 + 50 = ${ans}`);
  }
).post("add", 20, 50);

//"prime"同期呼出
//print(axcli.send("prime", 50)); // ans is only 2!

//"prime"非同期呼出
axcli.rcvr(
  function(name, cnt, prime, *rest) {
    if (name=='end') {
      print("completed calc-prime!!");  //サーバー側で、「return "end";」 が実行された場合
    }else{
      print("[" + cnt + "] 20 + 50 = " + ans);
    }
  }
).post("prime", 20, 50);

//メッセージループ(5秒間)
axa.msgLoop(5*1000);

/*
20 + 50 = 70
[1] 2
[2] 3
 ・
 ・
[14] 43
[15] 47
*/


AxA : 関数,メソッド・・・リスト
callnameプロパティ 呼び出されたcall関数名
rindexプロパティ call関数が呼び出されたときのインデックス番号
returnValsメソッド関数 postで呼び出されたときクライアント側に結果を返します
returnNValsメソッド関数 postで呼び出されたときクライアント側に結果名をつけて結果を返します
closeメソッド関数 クライアント側のpost呼出での返信通信を終了します
throwErrorメソッド関数 クライアント側にエラーを返します
returnStateメソッド関数 クライアント側に状態を返します

callname プロパティ ...

呼び出されたcall関数名

axcontext.callname : String

rindex プロパティ ...

postメソッド関数で呼び出されたときのインデックス番号

axcontext.rindex() : Integer

解説
postメソッド関数で呼び出された場合、インデックス番号>0
sendメソッド関数で呼び出された場合、インデックス番号は 0になります。

rindex>0のとき(すなわち postメソッド関数で呼び出された場合)、
returnVals, returnNValsメソッド関数で何度もクライアントに値を返すことができます。
ただし、return文で値を返したり、closeメソッド関数が実行されると、その後、値を返すことはできません。
また実行エラーが起きた場合や、throwErrorメソッド関数が実行された場合でも、その後、値を返すことはできません。

returnVals メソッド関数 ...

postで呼び出されたときクライアント側に結果を返します

axcontext.returnVals( r1, r2, ... ) : Boolean

引数
r1, r2, ... (最大8個)
0~最大8個、結果が返せます。
返値
rindex=0やAXserverが削除されていれば、falseを返します。 内部で返信処理が実行できたら、trueを返します
解説
サーバー側でこのreturnValsメソッド関数が実行されると、postメソッドのAXreceiverオブジェクトのon_return関数へ引数値を受け渡して呼び出されます。

function on_return(name, r1,r2,...rest) {
    //nameは post(callname,...)のcallnameと同じ
    //r1, r2, ...に結果がセットされている
    ・・・
}

returnNVals メソッド関数 ...

postで呼び出されたときクライアント側に結果名をつけて結果を返します

axcontext.returnNVals(name, r1, r2, ... ) : Boolean

引数
name : String
結果名 (close, error以外であること!)
r1, r2, ... (最大8個)
0~最大8個、結果が返せます。
返値
rindex=0やAXserverが削除されていれば、falseを返します。 内部で返信処理が実行できたら、trueを返します
解説
サーバー側でこのreturnNValsメソッド関数が実行されると、postメソッドのAXreceiverオブジェクトのon_return関数へ引数値を受け渡して呼び出されます。

function on_return(name, r1,r2,...rest) {
    //nameは 結果名がsetされます。
    //r1, r2, ...に結果がセットされている
    ・・・
}

close メソッド関数 ...

クライアント側のpost呼出での返信通信を終了します

axcontext.close() : Boolean

返値
rindex=0やAXserverが削除されていれば、falseを返します。 内部で返信通信を終了できたら、trueを返します

throwError メソッド関数 ...

クライアント側にエラーを返します

axcontext.throwError( errorMsg ) : Boolean

引数
errorMsg : String
エラーメッセージ文字列。
解説
サーバー側でこのthrowErrorメソッド関数が実行されると、postメソッドのAXreceiverオブジェクトのon_rstate関数へエラーメッセージ文字列を渡します。

function on_rstate(name, errorMsg, ...rest) {
    //name=="error"
    //errorMsgは上記のエラーメッセージ文字列
    ・・・
}

returnState メソッド関数 ...

クライアント側に状態を返します

axcontext.returnState(state, s1, s2, ... ) : Boolean

引数
state : String
状態名 (close, error以外であること!)
s1, s2, ... (最大8個)
0~最大8個、状態値が返せます。
返値
rindex=0やAXserverが削除されていれば、falseを返します。 内部で状態返信処理が実行できたら、trueを返します
解説
サーバー側でこのreturnStateメソッド関数が実行されると、postメソッドのAXreceiverオブジェクトのon_rstate関数へ引数値を受け渡して呼び出されます。

function on_rstate(state, s1,s2, ...rest) {
    //nameは 結果名がsetされます。
    //s1, s2, ...に状態値がセットされている
    ・・・
}

AXclient クラス...

AXサーバーからのサービスを受けるには、サーバー名をgetoutAX関数に渡してクライアントオブジェクトを取得し、このオブジェクトのsend, postメソッド関数を実行してできます。
このオブジェクトはAXclientクラスのインスタンスです。

以下、AXクライアントの実装を簡単に説明します。
  1. 準備(AXクライアントオブジェクト取得関数(getoutAX)を axclientモジュールから取り出す)
  2.       var axa = require('axa');
          var {getoutAX} = require('axclient');
        
  3. AXクライアントオブジェクトを取得)
  4.       var axcli = getoutAX.getoutAX("SAMPLE");  //サーバーサイトで名前”SAMPLE"で作成されたオブジェクト
        
  5. "add"サービスをsend関数(同期)で呼び出す
  6.       alert( axcli.send("add", 20, 50) );  //  70
        
  7. axcliの"prime"サービスをpost関数で呼び出し、値を非同期に返す
  8.       axcli.rcvr(
            function(name, count, n) {
              print(`[${count}] ${n}`);
            }
          ).post("prime", 50, 100) );  // 50以下の整数リストを 100ミリ秒毎に計算
          
          axa.msgLoop(5*1000); // 5秒間、上記の計算を受け取るためのメッセージループ
          /*
          [1] 2
          [2] 3
           ・
           ・
          [14] 43
          [15] 47
          */
        
  9. サーバーを終了
  10.       axcli.close();
        
  11. クライアントを終了
  12.       axa.exit();
        
AXclient : 補助関数・メソッド関数・・・リスト
send メソッド関数 サービスの同期呼出
post, post_ メソッド関数 サービスの非同期呼出
rcvr メソッド関数 サービス非同期呼出のレシーバーを作成
setHandler メソッド関数 サーバーの状態通知を取得する関数を登録

send メソッド関数 ...

サービスの同期呼出

axcli.send(callname, a1, a2, ...) : Integer, String, Bool, AxVarが扱う値の型

引数
callname : String
サービス名
a1, a2, ...
AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値を引数として渡せます。 その個数は、0~最大8個の引数値が渡せます。
返値
サーバーのサービス関数が返した値を返します。
その値の型はAxVarオブジェクト(C/C++言語ではVARIANT型)が扱える型です。
解説
sendメソッド関数を呼出すと、サーバーのサービス関数が終了するまで待機し、サービス関数がreturn 値した値が返ってきます。
関数が終了するまで待機する呼び方を同期呼出と言います。

post メソッド関数 ...

サービスの非同期呼出

axcli.rcvr(on_return=null, on_rstate=null).post(callname, a1, a2, ...)
axcli(on_return=null, on_rstate=null).post(callname, a1, a2, ...)

axcli.post(callname, a1, a2, ...).catch(on_return=null, on_rstate=null)
axcli.post(callname, a1, a2, ...)(on_return=null, on_rstate=null)

axcli.post_(callname, a1, a2, ...)

引数
on_return : Function
サーバー側サービス関数が返した値を受け取る関数。受け取る必要がないときはnullを渡す。
function on_return(name, r1, r2, ...rest) {
  //name : String 返値の意味名 普通はcallname
  //r1, r2, ...rest 最大8個の返値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
on_rstate : Function
サーバー側のサービス関数が実行中、状態などの通知を受け取る関数。受け取る必要がないときはnullを渡す。
function on_rstate(state, s1, s2, ...rest) {
  //state : String 状態名 state="close", "error"なら、このpostによる通信(返値と通知)はすべて終了します。
  //s1, s2, ...rest 最大8個の状態値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
callname : String
サービス名
a1, a2, ...
AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値を引数として渡せます。 その個数は、0~最大8個の引数値が渡せます。
解説
postメソッド関数の呼出はすぐに終了し、プログラムは次のステップを実行します。
そして、値と状態の通知の受取は メッセージループの実行中に行います。
このような実行方法を非同期呼出と言います。

post_メソッド関数の呼出は。通信(返値と通知)を必要としない非同期呼出です。
axcli.post_(callname, a1, a2, ...)は

axcli.rcvr().post(callname, a1, a2, ...)
axcli().post(callname, a1, a2, ...)

axcli.post(callname, a1, a2, ...).catch()
axcli.post(callname, a1, a2, ...)()

と同じです。

rcvr メソッド関数 ...

サービス非同期呼出のレシーバーを作成

axcli.rcvr(on_return=null, on_rstate=null) : AXreceiver
axcli(on_return=null, on_rstate=null) : AXreceiver

引数
on_return : Function
サーバー側サービス関数が返した値を受け取る関数。受け取る必要がないときはnullを渡す。
function on_return(name, r1, r2, ...rest) {
  //name : String 返値の意味名 普通はcallname
  //r1, r2, ...rest 最大8個の返値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
on_rstate : Function
サーバー側のサービス関数が実行中、状態などの通知を受け取る関数。受け取る必要がないときはnullを渡す。
function on_rstate(state, s1, s2, ...rest) {
  //state : String 状態名 state="close", "error"なら、postによる通信(返値と通知)をすべて終了します。
  //s1, s2, ...rest 最大8個の状態値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
返値
結果と状態を受け取れるAXreceiverオブジェクトを返す。

setHandler メソッド関数 ...

サーバーの状態通知を取得する関数を登録

axcli.setHandler(ax_on_rstate)

引数
ax_on_rstate : Function
サーバーの状態通知を受け取る関数。
function ax_on_rstate(state, s1, s2, ...rest) {
  //state : String 状態の意味名  特にstate=="close"の場合、サーバーの終了通知
  //s1, s2, ...rest 最大8個の状態値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
解説
サーバー側で
axsv.returnState(state, s1,s2);
が実行された場合、ax_on_rstate関数が呼び出されます。

また、クライアントaxcliに対するサーバーaxsvが終了したときにも、state="close"がsetされてax_on_rstate関数が呼び出されます。

AXreceiver クラス...

AXreceiverクラスは AXサーバーからのサービスを非同期で結果や状態を受け付けるためのオブジェクトのクラスです。

AXreceiver : 補助関数・メソッド関数・・・リスト
post メソッド関数 サービスの非同期呼出
catch メソッド関数 レシーバーに結果や状態を受け付ける関数をセットして内部でpostを実行

post メソッド関数 ...

サービスの非同期呼出

axrcvr.post(callname, a1, a2, ...)

引数
axrcvr : AXreciver
axcli.rcvr(on_return, on_rstate)が返したオブジェクト。
callname : String
サービス名
a1, a2, ...
AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値を引数として渡せます。 その個数は、0~最大8個の引数値が渡せます。
解説
Axclientオブジェクトのpostメソッド関数の説明を読んでください。

catch メソッド関数 ...

レシーバーに結果や状態を受け付ける関数をセットして内部でpostを実行

axrcvr.catch(on_return=null, on_rstate=null)

引数
on_return : Function
サーバー側サービス関数が返した値を受け取る関数。受け取る必要がないときはnullを渡す。
function on_return(name, r1, r2, ...rest) {
  //name : String 返値の意味名 普通はcallname
  //r1, r2, ...rest 最大8個の返値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
on_rstate : Function
サーバー側のサービス関数が実行中、状態などの通知を受け取る関数。受け取る必要がないときはnullを渡す。
function on_rstate(state, s1, s2, ...rest) {
  //state : String 状態名 state="close", "error"なら、postによる通信(返値と通知)をすべて終了します。
  //s1, s2, ...rest 最大8個の状態値が送られてる。AxVarオブジェクト(C/C++言語ではVARIANT型)が扱える値
  ・・・ //受け取って処理する
}
解説
Axclientオブジェクトのpostメソッド関数の説明を読んでください。

OgOx.AxA ActiveXオブジェクトクラス...

OgOx.AxAは、ActiveXオブジェクトです。このオブジェクトをAxAオブジェクトと呼ぶことにします。
AxAオブジェクトを使えば、ActiveXオブジェクトをプロセス間で共有することができます。

AxAオブジェクトの作成方法は以下のようにします。
var axa = require('axa');
var AxA = newAxA();

以下は、2つのプロセス間でExcel(ActiveXオブジェクト)を共有する例です。



axa, axserverとaxclientモジュールを使ったプロセス間通信は、内部でこのAxAオブジェクトを使っています。


AxA : 関数・・・リスト
method
dataプロパティ共通データ
reg関数ActiveXオブジェクトをAxAへ登録
unreg関数ActiveXオブジェクトをAxAから登録を外す
getout関数AxAからActiveXオブジェクトを取り出す
isValid関数AciveXオブジェクトが登録されてるかをチェック
exists関数指定名のAciveXオブジェクトが登録されているかを判定
asearch関数指定名の登録をイベント待ち
quit_asearch関数登録のイベント待ちを解除
event
Foundイベントregで登録されたとき、asearchで登録待ちに対するイベント
Getoutingイベントgetoutで取り出されたとき、regで登録したAxAに送るイベント

data プロパティ OgOx.AxA...

共通データ

AxA.data(name,prop[,password]).$ = value
variable = AxA.data(name,prop[,password]).$

引数
name : String
登録名
prop : String
プロパティ名
password : String
登録名に対するパスワード(reg, unreg関数)
省略可能
value : Boolean, Number, String
共通データの値

reg 関数 OgOx.AxA...

ActiveXオブジェクトをAxAへ登録

AxA.reg( name, obj[, refcount, password]) : Boolean

引数
name : String
登録名
obj
登録するActiveXオブジェクト
refcount
参照回数(getout関数で取り出せる回数)。
refcount<=0 なら、無制限に参照できます。
デフォルト値は-1
password
パスワード。デフォルト値は ""。
他のプロセスから勝手にに削除(unreg関数)させないために、 パスワードをセットします。
返値
登録に成功した場合、trueを返します。
すでに同じ名前で登録されていた場合、登録せずfalseを返します。
解説
登録名を知るプロセスは、この登録したActiveXオブジェクトを自由に取り出すことができます。
このことはオブジェクトを連携してシステムを組む場合、セキュリティが緩く非常に危険です。
それを回避するために、この登録名を見慣れない名前を指定して他の登録名と一致させないことが大切です。
make_guid_str関数を使って生成されるGUID文字列を登録名に使えば、一致しにくくなります。
ただし、連携してActiveXオブジェクトを取り出すプロセス側にはこの登録名を教えておかなければなりません。

パスワードについても同様である。そのためにmake_guid_str関数を使ってパスワードを発生してもよい。 ただし、このパスワードを他のプロセスに教えてはいけません。勝手に削除されてしまうからです。
      const _my_excel_name_ = "36bdd843-448c-4318-8791-aabbccddeeff"; //excelオブジェクトを取り出すプロセス側にだけに教えておく名前

      var {newAxA, make_guid_str} = require('axa');
      var {ActiveX} = require('ole');

      var AxA = newAxA();
      var  _my_password_ = make_guid_str();  // 他のプロセスが知りえないパスワード

      var excel = new ActiveX("Excel.Application");
      AxA.reg(_my_excel_name_, excel, 1, _my_password_);
        ・・・
        // 他のプロセスが AxA.getout(_my_excel_name_)を実行して、このexcelオブジェクトを取り出す
        ・・・
      AxA.unreg(_my_excel_name_, _my_password_);  //プログラムの終了処理
    

unreg 関数 OgOx.AxA...

ActiveXオブジェクトをAxAから登録を外す

AxA.unreg( name[, password]) : Boolean

引数
name : String
外したい登録名
password
パスワード。デフォルト値は ""。
reg関数でパスワードを設定して登録した場合、そのパスワードを引数にしないと登録を外すことができません。
返値
登録を外しに成功した場合、trueを返します。
失敗した場合、falseを返します。

getout 関数 OgOx.AxA...

AxAからActiveXオブジェクトを取り出す

AxA.getout( name) : ActiveX

引数
name : String
オブジェクト登録名
返値
取り出しに成功した場合、登録されてるActiveXオブジェクトを返します。
失敗した場合、nullを返します。
      var {newAxA} = require('axa');
      const _my_excel_name_ = "36bdd843-448c-4318-8791-aabbccddeeff"; //excelオブジェクトを登録するプロセス側から教えてもらう名前

      var AxA = newAxA();

      var excel = AxA.getout(_my_excel_name_);
    

isValid 関数 OgOx.AxA...

AciveXオブジェクトが登録されてるかをチェック

AxA.isValid( name, obj) : Boolean

引数
name : String
登録名
obj : ActiveX
登録されてるActiveXと同じオブジェクトであるかを判定したいオブジェクト。
返値
登録しているActiveXオブジェクトと同じなら、trueを返します。
そうでなければ、falseを返します。

exists 関数 OgOx.AxA...

指定名のAciveXオブジェクトが登録されているかを判定

AxA.exits( name ) : Boolean

引数
name : String
登録名
返値
指定名のAciveXオブジェクトが登録されていば、trueを返します。
そうでなければ、falseを返します。

asearch 関数 OgOx.AxA...

指定名の登録をイベント待ち

AxA.asearch( name )

引数
name : String
指定名の登録を待つ
返値
なし
AxAで登録名nameのActiveXオブジェクトが登録されたら、Found(name)イベントが発生します。
このイベントの後、getoutメソッド関数でActiveXオブジェクトを取り出すことができます。
取り出したら、内部でquit_asearchメソッド関数が実行され、その後Found(name)イベントが受け取ることはありません。

quit_asearch 関数 OgOx.AxA...

登録のイベント待ちを解除

AxA.quit_asearch( name )

引数
name : String
解除したい登録名
返値
なし
quit_asearchメソッド関数の実行した後、Found(name)イベントが受け取ることはありません。

Found イベントOgOx.AxA...

regで登録されたとき、asearchで登録待ちに対するイベント

event Found( name )

受信値
name : String
登録名nameのActiveXオブジェクトが登録された。
解説
このイベントを受信したら、getoutメソッド関数でActiveXオブジェクトを取り出すことができます。
取り出したら、内部でquit_asearchメソッド関数が実行され、その後Found(name)イベントが受け取ることはありません。

Getouting イベントOgOx.AxA...

getoutで取り出されたとき、regで登録したAxAに送るイベント

event Getouting( name, refcount )

受信値
name : String
登録名nameのActiveXオブジェクトが取り出されている。
refcount : Integer
nameのActiveXオブジェクトの取り出し後の参照回数。
解説
refcount=0になったとき、AxAはこのActiveXオブジェクトの登録を削除していることがこのイベントでわかります。

axpy(OgO), ogax(Python)モジュールを使ったプロセス間通信[...]

axpy(OgO),ogax(Python)モジュールを使えば、シームレスにOgOとPythonをつないでプロセス間通信ができます。
これらモジュールの実装は「axa, axserverとaxclientモジュール」を使っており、機能追加が可能な構造になっております。

シームレスとは、通信相手の変数アクセスや関数実行を少ない手順で簡単に実現できることです。
そのために、OgOとPythonは
  接続オブジェクト
  実行環境
を準備します。
その後、getSync/getAsync, setSync/setAsync, callSync/callAsync, execSync/execAsync, evalSync/evalAsyncメソッド関数を使って相手の機能を使うだけです。

axpy(OgO)は、AxPyクラスを提供するモジュールです。
ogax(Python)は、OgAxクラスを提供するモジュールです。



使い方を以下にサンプルを持って説明します。

OgOサイドの実装 実装スクリプトtest_ogo.js...

  1. 準備(AxPyクラスをaxpyモジュールから取り出す)
  2.     var {AxPy} = require('axpy');
      
  3. 接続先のPythonスクリプトを起動して接続オブジェクト作成
  4.     var py = new AxPy(__dirname + "\\test_python.py");
      
  5. Pythonからの実行環境を設定
  6.     //グローバルスコープを実行環境とする場合
        var xyz = "";
    
        function multiple(x,y) {
          return x * y;
        }
    
        /*
        //関数内スコープを実行環境とする場合
        function env(py) {
          var xyz = "";
    
          function multiple(x,y) {
            return x * y;
          }
      
          return (_s,..._a)=>eval(_s);
        }
        py.set_env( enb(py) );
        */
      
    ====以下、PytonとOgOの連携プログラム部分====
  7. Pythonにある変数、関数を(同期)アクセス
  8.     print("=Pythonにあるabc変数をアクセス=");
        py.setSync("abc", 123);
        print(`abc = ${py.getSync("abc")}`);
        
        print("=Pythonにあるadd関数を実行=");
        print(`20 + 30 => ${py.callSync("add", 20,30)}`);
        
        //= PythonからOgOスクリプトを実行 =
        py.callSync("test_exec");
      
  9. OgOからPythonの関数を定義し、その後その関数をOgOから実行
  10.     //OgOからPythonの関数を定義
        py.execSync(`
        # Python関数の定義
        def prime(N):
          n = 2
          primes = []
          cnt = 0
          while n<=N :
            primed = True
            for j in range(len(primes)) :
              if (n % primes[j])==0 :
                primed = False
                break
            if primed :
              cnt += 1
              primes.append(n)
              ogo.callSync("catch_prime",cnt,n)
            
            n += 1
        `);
        /*
        //上記スクリプト部分をファイルにした場合
        py.execSync(
          __snarf__(__dirname + "\\prime.py")
        );
        */
        
        //その後その関数をOgOから実行
        function catch_prime(cnt, n) {
          print(`prime[${cnt}] => ${n}`);
        }
        
        async function calc_prime(N) {
          print("[start]calc_prime");
          await py.callAsync("prime", N);
          print("[end]calc_prime");
        }
        
        calc_prime(50);
        /*
        [start]calc_prime
        prime[1] => 2
        prime[2] => 3
        prime[3] => 5
        ・・・
        ・・・
        prime[15] => 47
        [end]calc_prime
        */
      
  11. つないだPythonとの接続を終了したい場合
  12.     py.close();
      

Pythonサイドの実装 実装スクリプトtest_python.py...

Pythonスクリプトに漢字コードが含まれている場合、スクリプトファイルの文字コードはUTF(8)を採用してください。
  1. 準備(OgAxクラスをogaxモジュールから取り出す)
  2.     import axa            #メッセージループのために axaモジュールが必要
        from ogax import OgAx
      
  3. OgOから実行環境を準備
  4.     # グローバルスコープを実行環境としたい場合
        abc = 0
    
        def add(x, y) :
          return x + y
        
        #Test to access to ogo
        def test_exec() :
          ogo.execSync(r"""
        print("\n[test_exec]---------");
        print("=PythonからOgOにある変数を(同期)アクセス=");
        xyz = "OgOはアプリを繋いでくれる便利なツールです!";
        print("xyz = ${xyz}");
        
        print("=PythonからOgOにあるmultiple関数を(同期)実行=");
        print("20 * 30 => ${multiple(20, 30)}");
        """)
    
        # 関数内スコープを実行環境としたい場合
        """
        def env( ogo ) :
          ・・・
          上記スクリプトを記述
          ・・・
          return locals()
        """
      
  5. OgOから接続される接続オブジェクト作成
  6.     ogo = OgAx();
      
  7. OgOからの実行環境を設定
  8.     # グローバルスコープを実行環境とする場合
        ogo.set_env( globals() )
    
        # 関数内スコープを実行環境とする場合
        # ogo.set_env( env(ogo) )
      
  9. OgOとプロセス間通信にメッセージループが必要
  10.     axa.mainMsgLoop()
        または
        axa.msgLoop()
        axa.exit()
      

AxPy (OgO)クラス ...

AxPyはOgOからPythonにアクセスするための(OgO)クラスです。

以下、pyはAxPyクラスのインスタンスオブジェクトとして説明します。

AxPy : プロパティ・関数・・・リスト
AxPyコンストラクターOgOからPythonにアクセスするためのオブジェクトを作成(コンストラクタ)
set_env関数Pythonから実行依頼されたときの実行環境を設定
close関数Pythonとの接続関係を終了
on, addEventListenerイベント受信関数の登録
off, removeEventListenerイベント受信関数の削除
getSync関数Python実行環境にある変数の値を取得(同期実行)
getAsync関数Python実行環境にある変数の値を取得(非同期実行)
setSync関数Python実行環境にある変数に値を設定(同期実行)
setAsync関数Python実行環境にある変数に値を設定(非同期実行)
callSync関数Python実行環境にある関数を実行(同期実行)
callAsync関数Python実行環境にある関数を実行(非同期実行)
execSync関数Python実行環境でスクリプトを実行(同期実行)
execAsync関数Python実行環境でスクリプトを実行(非同期実行)
evalSync関数Python実行環境で式を評価(計算)(同期実行)
evalAsync関数Python実行環境で式を評価(非同期実行)
set_async関数get,set,call,exec,evalを上記xxxSync,xxxAsync関数の簡略名に設定
postMessage関数Python実行環境にデータ(message)を非同期で送る
messageReceiver関数Python側からogo.postMessage関数で送られたデータ(message)を受け取る関数を登録
axcliプロパティPythonにあるサービスを実行するためのAXオブジェクト
usersvプロパティPythonにサービスを提供するためのAXオブジェクト

AxPy コンストラクター AxPy...

OgOからPythonにアクセスするためのオブジェクトを作成

let {AxPy} = require('axpy');

py = new AxPy( pysname[, option] ) : AxPy
py = new AxPy( [option] ) : AxPy

引数
pysname : String
pythonスクリプトファイル名 このスクリプトではogaxモジュールを使ってOgOと接続できる環境とOgOから呼ばれるサービス関数を作成します。
pysnameが指定なしでも動作します。ただし、この場合 関数など準備されてないので、py.execSync/execAsync(...)関数で実行環境を構築しなければいけません。
option : Object
オプション指定オブジェクト
{sname:pythonスクリプトファイル名, env:Pythonから実行依頼されたときの実行環境}
snameは引数pysnameが渡されないとき、オプション指定で渡せます。
envはset_env関数で、AxPyオブジェクト作成後に設定できます。
exeは、Pythonエンジンプログラムのパス名を指定できます。省略された場合、"Python.exe"が指定されます。
返値
PythonにAccessするための AxPyオブジェクト を返します。

set_env 関数AxPy...

Pythonから実行依頼されたときの実行環境を設定

old_env = py.set_env( [env] ) : Function

引数
env : Function
Pythonから実行依頼されたとき、実行するeval関数を渡す。(eval関数を囲むスコープがPythonから実行依頼されたときの実行環境となります。)
(1) 引数省略の場合、global scopeで実行するeval関数を設定します。
(2) 通常は次のような関数を作成し、その実行値(関数値)を渡します。
  function env() {
    /*
      変数の宣言や関数を定義
      そのほか、関数内でスクリプトが実行
    */
    ....
    return (_s,..._a)=>eval(_s);  //必ず最後にこのreturn文を実行
  }
  py.set_env( env() );
返値
実行前の環境(eval実行関数)を返す。
解説
PythonのOgAxオブジェクトのメソッド関数
setSync,setAsync, getSync,getAsync, callSync,callAsync, execSync,execAsync, evalSync,evalAsync
が呼び出されたとき、
このset_env関数で設定した実行環境内でコードが実行されます。

close 関数AxPy...

Pythonとの接続を終了

py.close()

引数
なし
返値
なし
解説
接続先のPythonを終了させます。

on, addEventListener 関数AxPy...

イベント受信関数の登録

py.on(eventname, func) : AxPy(=py)
py.addEventListener(eventname, func) : Boolean

引数
eventname : String
イベント名. 現在受け付けるイベントは次の1つだけです。
"closing"
func : Function
イベント名により関数タイプが決まります。

"closing" --- AxPyが閉じる途中のイベント
function () {
  ・・・//axa.breakLoop() メッセージループの中止
}
返値
onメソッド関数の場合、pyを返す。
addEventListenerメソッド関数の場合、trueなら登録を成功、falseなら失敗しています。

off, removeEventListener 関数AxPy...

イベント受信関数の削除

py.on(eventname, func) : AxPy(=py)
py.removeEventListener(eventname) : Boolean

引数
eventname : String
イベント名. 現在受け付けるイベントは次の1つだけです。
"closing"
返値
offメソッド関数の場合、pyを返す。
removeEventListenerメソッド関数の場合、trueなら登録を成功、falseなら失敗しています。

getSync 関数AxPy...

Python実行環境にある変数の値を取得(同期実行)

value = py.getSync( name ) : Any

引数
name : String
Python実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
返値
nameのPython実行環境における評価値(実行値)を返す。

getAsync 関数AxPy...

Python実行環境にある変数の値を取得(非同期実行)

value = await py.getAsync( name ) : Any

引数
name : String
Python実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
返値
nameのPython実行環境における評価値(実行値)を返す。
解説
非同期実行なので、
  py.getAsync(name);
は、Pythonに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = await を置けば、Pythonが評価値(実行値)を返してくるのを待って値を取得します。

setSync 関数AxPy...

Python実行環境にある変数に値を設定(同期実行)

py.setSync( name, value )

引数
name : String
Python実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし

setAsync 関数AxPy...

Python実行環境にある変数に値を設定(非同期実行)

py.setAsync(name, value);

await py.setAsync(name, value);

引数
name : String
Python実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし
解説
非同期実行なので、
  py.getAsync(name);
は、Pythonに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = await を置けば、Pythonが評価値(実行値)を返してくるのを待って値を取得します。

callSync 関数AxPy...

Python実行環境にある関数を実行(同期実行)

value = py.callSync(fname, arg1,arg2,...)

引数
fname : String
Python実行環境にある関数名 あるいは、オブジェクトを含めたメソッド(obj.metodなど)
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
Pyton実行環境での(fname)関数実行の結果を返す。

callAsync 関数AxPy...

Python実行環境にある関数を実行(非同期実行)

py.callAsync(fname, arg1,arg2,...)

value = await py.callAsync(fname, arg1,arg2,...)

引数
fname : String
Python実行環境にある関数名 あるいは、オブジェクトを含めたメソッド(obj.metodなど)
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
Pyton実行環境での(fname)関数実行の結果を返す。
解説
非同期実行なので、
  py.callAsync(fname, arag1,arg2,...);
は、Pythonに実行依頼してすぐ終了します。
関数実行結果を取得したい場合、
value = await を置けば、Pythonが関数実行結果を返してくるのを待って、その値を取得します。

execSync 関数AxPy...

Python実行環境でスクリプトを実行(同期実行)

py.execSync(script[,arg1,arg2,...])

引数
script : String
Pythonスクリプト
arg1,arg2,...
scriptの実行に渡す引数(JSO形式に変換可能な値)
scriptにおいて、_a[0],_a[1],...で値が参照できます。
返値
なし

execAsync 関数AxPy...

Python実行環境でスクリプトを実行(非同期実行)

py.execAsync(script[, arg1,arg2,...])

await py.execAsync(script[, arg1,arg2,...])

引数
script : String
Pythonスクリプト
arg1,arg2,...
scriptの実行に渡す引数(JSO形式に変換可能な値)
scriptにおいて、_a[0],_a[1],...で値が参照できます。
返値
なし
解説
非同期実行なので、
  py.execAsync(script, arag1,arg2,...);
は、Pythonに実行依頼してすぐ終了します。
script実行を完了して次の処理を行ないたい場合、
await を置いて実行してください。

evalSync 関数AxPy...

Python実行環境で式を評価(計算)(同期実行)

value = py.evalSync(expression[,arg1,arg2,...])

引数
expression : String
Python 式
arg1,arg2,...
式に渡す引数(JSO形式に変換可能な値)
式において、_a[0],_a[1],...で値が参照できます。
返値
式を評価(計算)した値を返す。

evalAsync 関数AxPy...

Python実行環境で式を評価(非同期実行)

value = await py.evalAsync(expression[, arg1,arg2,...])

引数
expression : String
Python 式
arg1,arg2,...
式に渡す引数(JSO形式に変換可能な値)
式において、_a[0],_a[1],...で値が参照できます。
返値
式を評価(計算)した値を返す。
解説
非同期実行なので、
  py.evalAsync(expression, arag1,arg2,...);
は、Pythonに計算依頼してすぐ終了しますが、
expression の計算結果を取得するために、await を置きます。

set_async 関数AxPy...

get,set,call,exec,evalを上記xxxSync,xxxAsync関数の簡略名に設定

old_mode = py.set_async(f=-1);

引数
f : Boolean
f=trueなら、get,set,call,exec,evalをxxxAsync関数として扱う。
f=falseなら、get,set,call,exec,evalをxxxSync関数として扱う。
引数を省略した場合、xxxSync,xxxAsync関数の切り替えをしない。
返値
この関数実行前の設定値を返す。
trueが返した場合、xxxAsync関数として扱うモードであった。
falseが返した場合、xxxSync関数として扱うモードであった。
解説
この初期設定値は、false.
すなわち、get,set,call,exec,evalをxxxSync関数として扱うようになっています。

postMessage 関数AxPy...

Python実行環境にデータ(message)を非同期で送る

py.postMessage(message)

引数
message
送りたいデータ(JSO形式に変換可能な値)
返値
なし
解説
Pythonの実行環境において送られたデータを受け取るには、以下のように事前に受け取り関数を
登録しておく必要があります。
  # Python側
  def recv( message ) :
    # 送られたデータは引数messageに入っています
    ....
  
  ogo.messageReceiver( recv )

messageReceiver 関数AxPy...

Python側からogo.postMessage関数で送られたデータ(message)を受け取る関数を登録

py.messageReceiver(recv)

引数
recv
送られたデータ(message)を受け取る関数
以下のようなrecv関数です。
function recv(message) {
  // Pythonから送られたデータは引数messageに入っています
  ...
}
py.messageReceiver(recv);
返値
なし

axcli プロパティAxPy...

Pythonにあるサービスを実行するためのAXオブジェクト

py.axcli : AX ActiveXオブジェクト [ReadOnly]

解説
同期呼出でPythonにあるサービスを実行する
value = axcli.send("servicename"[,arag1,arag2,...)

非同期呼出でPythonにあるサービスを実行する
axcli.post("servicename"[,arag1,arag2,...)(
  recv_result,
  recv_state
)

Pythonにあるサービスは、ogo.axsv AXオブジェクトに登録します。

usersv プロパティAxPy...

Pythonにサービスを提供するためのAXオブジェクト

py.usersv : AX ActiveXオブジェクト [ReadOnly]

解説
AXクラスの解説にあるように以下のようにしてサービスを実装する
py.usersv.on("servicename", servicefun(a1,a2,...) {
    //サービス処理
    ...
  },
  "[...]comment..."
);

Python側は、ogo.usercli AXオブジェクトを使ってこのサービスを呼び出します。

OgAx (Python)クラス ...

OgAxはPythonからOgOにアクセスするための(Python)クラスです。

以下、ogoはOgAxクラスのインスタンスオブジェクトとして説明します。

OgAx : プロパティ・関数・・・リスト
OgAxコンストラクターPythonからOgOにアクセスするためのオブジェクトを作成(コンストラクタ)
set_env関数OgOから実行依頼されたときの実行環境を設定
close関数OgOとの接続を閉じる
clearScope関数実行環境をクリア
getSync関数OgO実行環境にある変数の値を取得(同期実行)
getAsync関数OgO実行環境にある変数の値を取得(非同期実行)
setSync関数OgO実行環境にある変数に値を設定(同期実行)
setAsync関数OgO実行環境にある変数に値を設定(非同期実行)
callSync関数OgO実行環境にある関数を実行(同期実行)
callAsync関数OgO実行環境にある関数を実行(非同期実行)
execSync, evalSync関数OgO実行環境でスクリプトを実行(同期実行)
execAsync, evalAsync関数OgO実行環境でスクリプトを実行(非同期実行)
set_async関数get,set,call,exec,evalを上記xxxSync,xxxAsync関数の簡略名に設定
postMessage関数OgO実行環境にデータ(message)を非同期で送る
messageReceiver関数OgO側からpy.postMessage関数で送られたデータ(message)を受け取る関数を登録
usercliプロパティOgOにあるサービスを実行するためのAXオブジェクト
axsvプロパティOgOにサービスを提供するためのAXオブジェクト

OgAx コンストラクター OgAx...

PythonからOgOにアクセスするためのオブジェクトを作成(コンストラクタ)

from ogax import OgAx

ogo = OgAx(genv=None)
ogo = OgAx(AX_NAME, genv=None)

引数
genv : dict
OgOからPythonの実行要求があったときの実行環境。
genv = globals()を与えた場合、グローバル名前空間が実行環境となります。
また、
  def env() :
    #変数、関数を記述
    ...
    return locals();
  genv = env();
を与えた場合、env関数内のローカル名前空間が実行環境となります。
AX_NAME : str
OgOから与えられた暗号文字列で、この文字列でOgOとPythonをつなぐオブジェクトが相互に交換します。
省略した場合、Pythonが起動されたときの第2引数を採用します。
  python.exe scriptファイル名 AX_NAME
返値
接続実行されているOgOにAccessするための
  OgAxオブジェクト
を返します。

set_env 関数OgAx...

OgOから実行依頼されたときの実行環境を設定

old_env = ogo.set_env(env)

引数
env : dict
OgOからの実行依頼を、この与えられたシンボル名前空間オブジェクトで実行します。
Pythonのグローバルシンボル空間で実行したい場合、env=globals()を渡します。
関数内のローカルシンボル名前空間で実行したい場合、
  def mkenv(ogo) :
    /*
      変数の宣言や関数を定義
      そのほか、関数内でスクリプトが実行
    */
    ....
    return locals()  //必ず最後にこのreturn文を実行
  
  env = mkenv( ogo );
を渡す。
返値
なし
解説
OgOのAxPyオブジェクトのメソッド関数
setSync,setAsync, getSync,getAsync, callSync,callAsync, execSync,execAsync, evalSync,evalAsync
が呼び出されたとき、
このset_env関数で設定した実行環境内でコードが実行されます。

close 関数OgAx...

OgOとの接続を閉じる

ogo.close()

引数
なし
返値
なし
解説
OgOとの接続を閉じます。

clearScope 関数OgAx...

実行環境をクリア

ogo.clearScope()

引数
env : dict
なし
返値
なし
解説
OgOからpy.execSync(...), py.execAsync(...)を使うと、実行環境が変数や関数が追加され煩雑になってきます。
初期状態に戻すために
  ogo.clearScope()
を実行します。そうすると、
  ogo.set_env(env)
が実行されたときの状態に戻ります。

getSync 関数OgAx...

OgO実行環境にある変数の値を取得(同期実行)

value = ogo.getSync(name)

引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
返値
nameのOgO実行環境における評価値(実行値)を返す。

getAsync 関数OgAx...

OgO実行環境にある変数の値を取得(非同期実行)

value = await ogo.getAsync(name)

引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
返値
nameのOgO実行環境における評価値(実行値)を返す。
解説
非同期実行なので、
  ogo.getAsync(name);
は、OgOに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = wait を置けば、OgOが評価値(実行値)を返してくるのを待って値を取得します。

setSync 関数OgAx...

OgO実行環境にある変数に値を設定(同期実行)

ogo.setAsync(name, value)

引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし

setAsync 関数OgAx...

OgO実行環境にある変数に値を設定(非同期実行)

ogo.setAsync(name, value)

await ogo.setAsync(name, value)

引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし
解説
非同期実行なので、
  ogo.getAsync(name);
は、OgOに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = wait を置けば、OgOが評価値(実行値)を返してくるのを待って値を取得します。

callSync 関数OgAx...

OgO実行環境にある関数を実行(同期実行)

value = ogo.callSync(fname, arg1,arg2,...)

引数
fname : String
OgO実行環境にある関数名 あるいは、オブジェクトを含めたメソッド(obj.metodなど)
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
OgO実行環境での(fname)関数実行の結果を返す。

callAsync 関数OgAx...

OgO実行環境にある関数を実行(非同期実行)

ogo.callAsync(fname, arg1,arg2,...)

value = await ogo.callAsync(fname, arg1,arg2,...)

引数
fname : String
OgO実行環境にある関数名 あるいは、オブジェクトを含めたメソッド(obj.metodなど)
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
OgO実行環境での(fname)関数実行の結果を返す。
解説
非同期実行なので、
  ogo.callAsync(fname, arag1,arg2,...);
は、OgOに実行依頼してすぐ終了します。
関数実行結果を取得したい場合、
value = wait を置けば、OgOが関数実行結果を返してくるのを待って、その値を取得します。

execSync, evalSync 関数OgAx...

OgO実行環境でスクリプトを実行(同期実行)

value = ogo.execSync(script[,arg1,arg2,...])
value = ogo.evalSync(script[,arg1,arg2,...])

引数
script : String
OgOスクリプトまたは式
arg1,arg2,...
scriptの実行に渡す引数(JSO形式に変換可能な値)
scriptにおいて、_a[0],_a[1],...で値が参照できます。
返値
scriptを実行し、最後の式の評価(実行)値を返します。

execAsync 関数OgAx...

OgO実行環境でスクリプトを実行(非同期実行)

ogo.execAsync(script[, arg1,arg2,...])
ogo.evalAsync(script[, arg1,arg2,...])

value = await ogo.execAsync(script[, arg1,arg2,...])
value = await ogo.evalAsync(script[, arg1,arg2,...])

引数
script : String
OgOスクリプトまたは式
arg1,arg2,...
scriptの実行に渡す引数(JSO形式に変換可能な値)
scriptにおいて、_a[0],_a[1],...で値が参照できます。
返値
scriptを実行し、最後の式の評価(実行)値を返します。
解説
非同期実行なので、
  ogo.execAsync(script, arag1,arg2,...);
は、OgOに実行依頼してすぐ終了します。
script実行を完了して次の処理を行ないたい場合や返値を取得したい場合
value = wait を置いて実行してください。

set_env 関数OgAx...

get,set,call,exec,evalを上記xxxSync,xxxAsync関数の簡略名に設定

old_mode = ogo.set_async(f=-1);

引数
f : Boolean
f=trueなら、get,set,call,exec,evalをxxxAsync関数として扱う。
f=falseなら、get,set,call,exec,evalをxxxSync関数として扱う。
引数を省略した場合、xxxSync,xxxAsync関数の切り替えをしない。
返値
この関数実行前の設定値を返す。
trueが返した場合、xxxAsync関数として扱うモードであった。
falseが返した場合、xxxSync関数として扱うモードであった。
解説
この初期設定値は、false.
すなわち、get,set,call,exec,evalをxxxSync関数として扱うようになっています。

postMessage 関数OgAx...

OgO実行環境にデータ(message)を非同期で送る

ogo.postMessage(message)

引数
message
送りたいデータ(JSO形式に変換可能な値)
返値
なし
解説
OgOの実行環境において送られたデータを受け取るには、以下のように事前に受け取り関数を
登録しておく必要があります。
  // OgO側
  function recv( message ) {
    // 送られたデータは引数messageに入っています
    ....
  }
  py.messageReceiver( recv )

messageReceiver 関数OgAx...

OgO側からpy.postMessage関数で送られたデータ(message)を受け取る関数を登録

ogo.messageReceiver(recv)

引数
recv
送られたデータ(message)を受け取る関数
以下のようなrecv関数です。
def recv(message) :
  # Pythonから送られたデータは引数messageに入っています
  ...

ogo.messageReceiver(recv)
返値
なし

usercli プロパティOgAx...

OgOにあるサービスを実行するためのAXオブジェクト

ogo.usercli : AX ActiveXオブジェクト [ReadOnly]

解説
同期呼出でOgOにあるサービスを実行する
value = usercli.send("servicename"[,arag1,arag2,...)

非同期呼出でOgOにあるサービスを実行する
usercli.post("servicename"[,arag1,arag2,...)(
  recv_result,
  recv_state
)

OgOにあるサービスは、py.usersv AXオブジェクトに登録します。

axsv プロパティOgAx...

Pythonにサービスを提供するためのAXオブジェクト

ogo.axsv : AX ActiveXオブジェクト [ReadOnly]

解説
AXクラスの解説にあるように以下のようにしてサービスを実装する
def servicefun(axcx, arg1, arg2, ...) :
  //サービス処理
  ...

ogo.usersv.on("servicename", servicefun, "[...]comment...")

OgO側は、py.axcli AXオブジェクトを使ってこのサービスを呼び出します。