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"); と同じです。
参照
例
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 と同じ。
参照
例
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)によって返値の型が決まります。
参照
解説
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, ...])と同じ。
参照
例
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番号でなくプロパティ名として解釈します。
参照
set_Property 関数 ActiveX...
ActiveXオブジェクトのプロパティ値を設定
activex.set_Property([args...], value)
引数
Property
ActiveXのプロパティ名。
args...
プロパティへ渡す引数。引数の数と型は、プロパティ(Property)によって決まります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
value : Any
プロパティに設定する値です。Propertyによって受け付ける値の型があります。
ActiveXオブジェクトライブラリーの説明資料を参照してください。
解説
ActiveXオブジェクトのプロパティに値を設定します。
activex.
set("Property",[args, ...],value)と同じ。
参照
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オブジェクトの列挙オブジェクトを作成
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クラス関数で作成されます。
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
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 プロパティは、型番号 追加情報(+修飾子番号) です。
基本型名
bool | AxVar.VT_BOOL | Boolean | bool |
short | AxVar.VT_I2 | Number | short |
int | AxVar.VT_I4 | Number | int |
long | AxVar.VT_I4 | Number | long |
float | AxVar.VT_R4 | Number | float |
double | AxVar.VT_R8 | Number | double |
date | AxVar.VT_DATE | Date | DATE |
string | AxVar.VT_BSTR | String | wchar_t[] |
activex | AxVar.VT_DISPATCH | ActiveX | IDispatch* |
variant | AxVar.VT_VARIANT | AxVar | VARIANT |
char | AxVar.VT_I1 | Number | char |
uchar | AxVar.VT_UI1 | Number | unsigned char |
ushort | AxVar.VT_UI2 | Number | unsigned short |
uint | AxVar.VT_UI4 | Number | unsigned int |
ulong | AxVar.VT_UI4 | Number | unsigned long |
longlong | AxVar.VT_I8 | Number | long long |
ulonglong | AxVar.VT_UI8 | Number | unsigned long long |
void | AxVar.VT_VOID | void | ? |
null | AxVar.VT_NULL | null | ? |
empty | AxVar.VT_EMPTY | ? | ? |
型追加情報
配列 | 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オブジェクトを返します。
参照
例
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を返します。
参照
例
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
返値
型変更に成功したら trueを返します。型変更できなかったら falseを返します。
参照
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オブジェクトが返されます。
参照
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 の配列を指定
参照
例
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
参照
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
参照
__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オブジェクトが取得できます。
<
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...
- 準備(AXサーバーブジェクト作成関数(newAX)、削除関数(delAX)をAXsvモジュールから取り出す)
var axserver = require('axserver');
var axa = require('axa');
- AXオブジェクト作成
var axsv = axserver.newAX("SAMPLE");
- インターフェス定義
//加算
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(...)を使って値を返すことを可能にします。
);
- メッセージループ
axa.msgLoop(); //アプリよって、メッセージループの書き方が違う
クライアントサイドの実装
実装スクリプトogo_client.js, ogo_client.py...
- 準備(AXクライアントオブジェクト取得関数(getoutAX)を axclientモジュールから取り出す)
var axa = require('axa');
var {getoutAX} = require('axclient');
- AXクライアントオブジェクトを取得)
var axcli = getoutAX("SAMPLE"); //サーバーサイトで名前”SAMPLE"で作成されたオブジェクト
- "add"サービスをsend関数(同期)で呼び出す
alert( axcli.send("add", 20, 50) ); // 70
- axcliの"prime"サービスをpost関数で呼び出し、値を非同期に返す
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
*/
- サーバーを終了
axcli.close();
- クライアントを終了
axa.exit();
[axa]axaモジュール...
newAxA 関数 axaモジュール...
ActiveXオブジェクト共有化をサポートオブジェクトを取得
var {newAxA} = require('
axa');
newAxA() : OgOx.AxA
返値
解説
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サーバーオブジェクトを作成
newAX(name, refcount=1) : AXserver
引数
name
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サーバーオブジェクトを削除
delAX(name) : Boolean
引数
name
サーバー名
返値
AXサーバーオブジェクトが削除に成功したら、trueを返します。
失敗したら、falseを返します。
getAX 関数 axserverモジュール...
AXサーバーオブジェクトを取得
getAX(name) : AXserver
引数
name
サーバー名
返値
引数 nameのAXサーバーオブジェクトがまだ削除されていなければ、そのAXサーバーオブジェクトを返します。
なければ、nullを返します。
exit 関数 axserverモジュール...
AXサーバーオブジェクトをすべて削除しサーバーを終了
exit(f)
引数
f : Integer
サーバーアプリプロセスが終了したときに返す値
解説
AXサーバーオブジェクトの削除とサーバーアプリの終了は非同期で処理されます。そのため、exit関数の呼び出しはすぐに終了し
その後、サーバーアプリがidling状態中に目的の処理がされて最後ににサーバーアプリが終了します。
[axclient]axclientモジュール...
getoutAX 関数 axclientモジュール...
AXクライアントオブジェクトを取り出す
getoutAX(name) : AXclient
引数
name
サーバー名
返値
引数 nameのAXサーバーに対するAXクライアントオブジェクトを返します。
なければ、nullを返します。
AXserver クラス ...
AXサーバーの実装は、newAX関数を呼び出して返されたブジェクトを使ってできます。
このオブジェクトはAXseverクラスのインスタンスです。
提供するサービスは、
onメソッド関数を使って登録します。
そして、サービスを受け取るAXクライアントからこれらのサービスを同期(
sendメソッド関数)、非同期(
postメソッド関数)で呼び出せます。
以下、AXサーバーの実装を簡単に説明します。
- AXサーバーの実装に必要なモジュールをロード
var axa = require('axa'); //AXサーバーとクライアントが通信するための補助ライブラリー
var {newAX, delAX} = require('axserver'); //AXサーバーオブジェクトの作成と削除
- AXサーバーオブジェクトの作成
var axsv = newAX("SAMPLE"); //サーバー名は"SAMPLE"
- サービスの登録
axsv.on("add", //サービス名"add"
function(a, b) { //サービスを実行する関数
return a + b;
},
"ans = a + b" //サービスの説明
);
- サービスできるようにするためのメッセージループ
axa.msgLoop();
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関数の仕様は、次のようになります。
- call名 が "*" でない場合
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オブジェクトが非同期で値を受け取ります。
}
- call名 == "*" の場合
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関数がデフォルトで最初から組み込まれています。
クライアント側で、このサーバーオブジェクトのサービスを知るために使えます。
- 説明文を取得するcall関数('?', call名)
- すべての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
*/
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クライアントの実装を簡単に説明します。
- 準備(AXクライアントオブジェクト取得関数(getoutAX)を axclientモジュールから取り出す)
var axa = require('axa');
var {getoutAX} = require('axclient');
- AXクライアントオブジェクトを取得)
var axcli = getoutAX.getoutAX("SAMPLE"); //サーバーサイトで名前”SAMPLE"で作成されたオブジェクト
- "add"サービスをsend関数(同期)で呼び出す
alert( axcli.send("add", 20, 50) ); // 70
- axcliの"prime"サービスをpost関数で呼び出し、値を非同期に返す
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
*/
- サーバーを終了
axcli.close();
- クライアントを終了
axa.exit();
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型)が扱える値
・・・ //受け取って処理する
}
返値
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サーバーからのサービスを非同期で結果や状態を受け付けるためのオブジェクトのクラスです。
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個の引数値が渡せます。
解説
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型)が扱える値
・・・ //受け取って処理する
}
解説
OgOx.AxA ActiveXオブジェクトクラス...
OgOx.AxAは、ActiveXオブジェクトです。このオブジェクトをAxAオブジェクトと呼ぶことにします。
AxAオブジェクトを使えば、ActiveXオブジェクトをプロセス間で共有することができます。
AxAオブジェクトの作成方法は以下のようにします。
var axa = require('axa');
var AxA = newAxA();
以下は、2つのプロセス間でExcel(ActiveXオブジェクト)を共有する例です。
axa, axserverとaxclientモジュールを使ったプロセス間通信は、内部でこの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
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
解除したい登録名
返値
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...
- 準備(AxPyクラスをaxpyモジュールから取り出す)
var {AxPy} = require('axpy');
- 接続先のPythonスクリプトを起動して接続オブジェクト作成
var py = new AxPy(__dirname + "\\test_python.py");
- Pythonからの実行環境を設定
//グローバルスコープを実行環境とする場合
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の連携プログラム部分====
- Pythonにある変数、関数を(同期)アクセス
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");
- OgOからPythonの関数を定義し、その後その関数をOgOから実行
//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
*/
- つないだPythonとの接続を終了したい場合
py.close();
Pythonサイドの実装
実装スクリプトtest_python.py...
Pythonスクリプトに漢字コードが含まれている場合、スクリプトファイルの文字コードはUTF(8)を採用してください。
- 準備(OgAxクラスをogaxモジュールから取り出す)
import axa #メッセージループのために axaモジュールが必要
from ogax import OgAx
- OgOから実行環境を準備
# グローバルスコープを実行環境としたい場合
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()
"""
- OgOから接続される接続オブジェクト作成
ogo = OgAx();
- OgOからの実行環境を設定
# グローバルスコープを実行環境とする場合
ogo.set_env( globals() )
# 関数内スコープを実行環境とする場合
# ogo.set_env( env(ogo) )
- OgOとプロセス間通信にメッセージループが必要
axa.mainMsgLoop()
または
axa.msgLoop()
axa.exit()
AxPy (OgO)クラス ...
AxPyはOgOからPythonにアクセスするための(OgO)クラスです。
以下、pyはAxPyクラスのインスタンスオブジェクトとして説明します。
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実行関数)を返す。
解説
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...
value = py.getSync( name ) : Any
引数
name : String
返値
getAsync 関数AxPy...
value = await py.getAsync( name ) : Any
引数
name : String
返値
解説
非同期実行なので、
py.getAsync(name);
は、Pythonに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = await を置けば、Pythonが評価値(実行値)を返してくるのを待って値を取得します。
setSync 関数AxPy...
py.setSync( name, value )
引数
name : String
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし
setAsync 関数AxPy...
py.setAsync(name, value);
await py.setAsync(name, value);
引数
name : String
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし
解説
非同期実行なので、
py.getAsync(name);
は、Pythonに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = await を置けば、Pythonが評価値(実行値)を返してくるのを待って値を取得します。
callSync 関数AxPy...
value = py.callSync(fname, arg1,arg2,...)
引数
fname : String
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
Pyton実行環境での(fname)関数実行の結果を返す。
callAsync 関数AxPy...
py.callAsync(fname, arg1,arg2,...)
value = await py.callAsync(fname, arg1,arg2,...)
引数
fname : String
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
Pyton実行環境での(fname)関数実行の結果を返す。
解説
非同期実行なので、
py.callAsync(fname, arag1,arg2,...);
は、Pythonに実行依頼してすぐ終了します。
関数実行結果を取得したい場合、
value = await を置けば、Pythonが関数実行結果を返してくるのを待って、その値を取得します。
execSync 関数AxPy...
py.execSync(script[,arg1,arg2,...])
引数
script : String
Pythonスクリプト
arg1,arg2,...
scriptの実行に渡す引数(JSO形式に変換可能な値)
scriptにおいて、_a[0],_a[1],...で値が参照できます。
返値
なし
execAsync 関数AxPy...
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...
value = py.evalSync(expression[,arg1,arg2,...])
引数
expression : String
Python 式
arg1,arg2,...
式に渡す引数(JSO形式に変換可能な値)
式において、_a[0],_a[1],...で値が参照できます。
返値
式を評価(計算)した値を返す。
evalAsync 関数AxPy...
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...
py.postMessage(message)
引数
message
送りたいデータ(JSO形式に変換可能な値)
返値
なし
解説
Pythonの実行環境において送られたデータを受け取るには、以下のように事前に受け取り関数を
登録しておく必要があります。
# Python側
def recv( message ) :
# 送られたデータは引数messageに入っています
....
ogo.messageReceiver( recv )
messageReceiver 関数AxPy...
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にアクセスするためのオブジェクトを作成(コンストラクタ)
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 );
を渡す。
返値
なし
解説
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...
value = ogo.getSync(name)
引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
返値
getAsync 関数OgAx...
value = await ogo.getAsync(name)
引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
返値
解説
非同期実行なので、
ogo.getAsync(name);
は、OgOに実行依頼してすぐ終了します。
評価値(実行値)を取得したい場合、
value = wait を置けば、OgOが評価値(実行値)を返してくるのを待って値を取得します。
setSync 関数OgAx...
ogo.setAsync(name, value)
引数
name : String
OgO実行環境にある変数名
あるいは、代入などの左辺に置くパターン(a[0]など)
value
設定したい値。ただし値は、JSON形式で表現可能な値です。
JSON形式の文字列ではないので勘違いしないでください。
返値
なし
setAsync 関数OgAx...
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...
value = ogo.callSync(fname, arg1,arg2,...)
引数
fname : String
OgO実行環境にある関数名
あるいは、オブジェクトを含めたメソッド(obj.metodなど)
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
callAsync 関数OgAx...
ogo.callAsync(fname, arg1,arg2,...)
value = await ogo.callAsync(fname, arg1,arg2,...)
引数
fname : String
OgO実行環境にある関数名
あるいは、オブジェクトを含めたメソッド(obj.metodなど)
arg1,arg2,...
関数に渡す引数(JSO形式に変換可能な値)
返値
解説
非同期実行なので、
ogo.callAsync(fname, arag1,arg2,...);
は、OgOに実行依頼してすぐ終了します。
関数実行結果を取得したい場合、
value = wait を置けば、OgOが関数実行結果を返してくるのを待って、その値を取得します。
execSync, evalSync 関数OgAx...
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.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.postMessage(message)
引数
message
送りたいデータ(JSO形式に変換可能な値)
返値
なし
解説
OgOの実行環境において送られたデータを受け取るには、以下のように事前に受け取り関数を
登録しておく必要があります。
// OgO側
function recv( message ) {
// 送られたデータは引数messageに入っています
....
}
py.messageReceiver( recv )
messageReceiver 関数OgAx...
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オブジェクトを使ってこのサービスを呼び出します。