2021年5月30日日曜日

60: UNO Interfaceを作成・登録する/マッピングイメージを生成する

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

自作のUNOコンポーネントをJava、C++、C#、Pythonにて作成するために。Java、C++、C#、Pythonのマッピングイメージを生成する。

話題


About: LibreOffice
About: Apache OpenOffice
About: Javaプログラミング言語
About: C++
About: Pythonプログラミング言語
About: C#
About: LibreOffice Basic
About: Apache OpenOffice Basic

この記事の目次


開始コンテキスト


  • 読者は、LibreOfficeまたはApache OpenOfficeの基本的知識を持っている。

ターゲットコンテキスト



  • 読者は、自作のUNOインターフェイスを作成・登録し、そのJava、C++、C#、Pythonマッピングイメージを生成する方法を知る。

オリエンテーション


UNOの基本的要素群についての記事があります。

UNOプログラムを開発する(LinuxまたはWindowsにて)環境を構築する方法についての記事があります。

任意のLibreOfficeまたはApache OpenOffice拡張機能を作成する基本についての記事があります。

任意のコンソールUNOクライアントを、JavaC++C#Pythonにて作成することについての記事があります。

任意のPythonマクロまたは任意のBasicマクロを格納する任意のLibreOfficeまたはApache OpenOffice拡張機能を作成することについての記事があります。


本体

ト書き
Hypothesizer 7、Objector 60A、Objector 60Bが、コンピューターの前にいる。


1: 自作のUNOコンポーネントを作成するために


Hypothesizer 7
自作のUNOインターフェイスを作成なさりたい理由は、自作のUNOコンポーネントを作成なさりたいということでしょう。

Objector 60A
残念でした!俺はサービスを作りたいんだ。

Hypothesizer 7
サー、「サービス」で何を意味されているのか私には定かではありませんが、もしも、私が'UNOサービス'と呼んでいるものを意味されているのであれば、多分、あなたは、必要条件として、UNOコンポーネントを作成されることになるでしょう。

Objector 60A
「多分」と言ったな、つまり、必ずしも「UNOコンポーネント」など全然作らなくてもよいわけだ!

Hypothesizer 7
仰るとおりです、サー、しかし、UNOサービスというものは、UNOコンポーネントをファクトリーに登録したものなので、あなたのUNOサービスは、既存のUNOコンポーネントのものになるでしょう。

Objector 60A
だから?それが悪いか?

Hypothesizer 7
特にそうではありません、しかし、その場合、あなたは、新たなUNOインターフェイスを全然必要としないでしょう。


2: なぜ、マッピングイメージが必要とされるのか


Hypothesizer 7
UNOインターフェイスというものは、プログラミング言語から独立したエンティティなので、あなたは、あなたのプログラミング言語群におけるマッピングイメージ群を必要とすることになります。

Objector 60B
「あなたのプログラミング言語群」?私のプログラミング言語群は何?

Hypothesizer 7
私は存じません、マダム。 . . . どのプログラミング言語にて、ご自分のUNOコンポーネントを作成されるおつもりですか?

Objector 60B
えーと、あなたが言って。

Hypothesizer 7
. . . 私は申し上げられません、マダム。

Objector 60B
じゃあ、C#ね、多分。

Hypothesizer 7
それでは、それがあなたのプログラミング言語です。

Objector 60B
でも、まだ私には1つしかプログラミング言語がないわ、あなたは「あなたのプログラミング言語群(複数)」と言ったでしょ!

Hypothesizer 7
もしも、単にあるC# UNOクライアントを作成されるのであれば、何らのUNOコンポーネントを作成なさる必要はないでしょう、したがってUNOインターフェイスも。

Objector 60B
はあ?なんで?

Hypothesizer 7
なぜなら、その場合は、普通のC#クラスで事足りるからです。UNOコンポーネントを必要とされるのは、別のプログラミング言語環境から操作できるオブジェクトを必要とされるからであり、その環境はC#環境であるかもしれませんが、必ずしもそうではありません。

Objector 60B
はあ?あなた大丈夫?うわごとを言っているようだけど。

Hypothesizer 7
. . . UNOが何のためのものであるかを理解される必要があります。

Objector 60B
とにかく、なんで「マッピングイメージ」が必要とされるわけ?

Hypothesizer 7
あるUNOコンポーネントをJavaにて作成されると仮定すると、あなたは当該UNOインターフェイスをJavaインターフェイスとして必要とします。

Objector 60B
なんで?

Hypothesizer 7
なぜなら、そのUNOコンポーネントは当該UNOインターフェイスを実装しなければなりませんが、Javaは、そのUNOコンポーネントがプログラミング言語独立なUNOインターフェイスを実装するなどということを許さないからです。

Objector 60B
許さないの?ずいぶんけちねえ!

Hypothesizer 7
. . . けちというよりも、そのようなプログラミング言語独立なエンティティは、単に、想定外だということです。

Objector 60A
あるプログラミング言語にてリモートUNOオブジェクトをアクセスしようという場合はどうなる、そのプログラミング言語にてUNOコンポーネントを作成しようというのでなく?

Hypothesizer 7
ああ、それは、そのプログラミング言語によります: Java、C++、C#は、その場合もマッピングイメージを必要としますが、Python、Basicは、必要としません。

Objector 60A
なんでそんな違いがある?

Hypothesizer 7
なぜなら、PythonとBasicは、静的に型付けされたプログラミング言語ではないからです。

Objector 60A
Pythonは、UNOコンポーネントがそこで作成される場合にもマッピングイメージを必要としないと言っているのか?

Hypothesizer 7
いいえ、そう言っておりません: Pythonは、その場合にはマッピングイメージを必要とします。

Objector 60A
Basicはどうだ?

Hypothesizer 7
Basicでは、UNOコンポーネントを作成することが全然できません、なぜなら、クラスを作成することが全然できないからです、ただし、リスナーオブジェクトを作成することはできますが、それは、マッピングイメージを必要としません。


3: あるUNOインターフェイスを作成する


Hypothesizer 7
あるUNOインターフェイスを作成するには、'.idl'ファイルを以下のように作成します。

theBiasPlanet/unoDatumTypes/testUnoExtension/XTestUnoExtensionUnoInterface.idl

@UNO IDL ソースコード
// # Change the defined variable name Start
#ifndef __theBiasPlanet_unoDatumTypes_test_XTest_idl__
#define __theBiasPlanet_unoDatumTypes_test_XTest_idl__
// # Change the defined variable name End

#include <com/sun/star/uno/XInterface.idl>
// # Add necessary idls Start
#include <com/sun/star/lang/IllegalArgumentException.idl>
// # Add necessary idls End

// # Change the module name
module theBiasPlanet {
	module unoDatumTypes {
		module test {
			// # Change the interface name
			interface XTest {
				// # Change the super interface and add more super interfaces if necessary
				interface ::com::sun::star::uno::XInterface;
				// # Add methods START
				string test1 ( [in] string a_name) raises (com::sun::star::lang::IllegalArgumentException);
				// # Add methods END
			};
		};
	};
};

#endif

Objector 60A
そのファイルは、パッケージ(もしくは、「モジュール」と呼ぶべきか?)ディレクトリに置かれるわけか . . .

Hypothesizer 7
実際には、位置も名前も本当はどうでもよいのですが、私は、整理のために、'.idl'ファイルをその構造で配置します。

Objector 60A
えーと、そのコードは、見れば分かるものだな、ほとんど。

Hypothesizer 7
注意すべきは、スーパーUNOインターフェイス(この場合は、「::com::sun::star::uno::XInterface」)はそこに置いたほうがよいということです、なぜなら、そこにはもっと多くのスーパーUNOインターフェイスをそこには追加できるからです、もしも、必要であれば。

Objector 60A
他のオプションが与えられてないのに、「ほうがよい」と言われても . . .

Hypothesizer 7
「interface XTest: ::com::sun::star::uno::XInterface {」のようにも書くことができますが、その方法では、ただ1つのスーパーUNOインターフェイスしか許されません。

Objector 60A
「[in]」以外に何が指定できるんだ?

Hypothesizer 7
'[out]'か'[inout]'です。注意すべきは、引数オブジェクトの変更(置換だけでなく)がメソッドの呼び出し元へ伝搬されるためには、一般的に言って、'[out]'または'[inout]'にしなければならないことです。

Objector 60B
はあ?あなた、寝言を言ってるの?

Hypothesizer 7
マダム、Javaにおいては、引数オブジェクトへの変更はメソッドの呼び出し元から可視ですが、UNOにおいてはそうではありません、一般的に言って。

Objector 60B
「置換」についてのたわごとは何だったの?

Hypothesizer 7
ポインター内のアドレスを置換することについて申し上げたのです。

Objector 60B
はあ?「ポインター」?

Hypothesizer 7
ご存知のように、Javaのいわゆる「リファレンスタイプ」変数は、「リファレンス」ではなく、ポインターです。

Objector 60B
はあ?リファレンスでしょ?

Hypothesizer 7
いいえ。そのようなずさんな用語体系は、一部の混乱の主要な原因です。もしも、それがポインターと呼ばれれば、要点は、水晶のようにクリアになるでしょう。

Objector 60A
なぜ、「一般的に言って」と言ってたんだ?

Hypothesizer 7
もしも、状況が完全にJava環境ローカルであれば、任意の'[in]'引数への変更は、メソッドの呼び出し元から可視になるでしょう、なぜなら、その呼び出しはただの通常のJavaメソッドコールになるからです。

Objector 60A
それは妙だぞ。

Hypothesizer 7
それは確かに妙ですが、事実です。


4: '.idl'ファイル群をコンパイルおよびアーカイブする


Hypothesizer 7
'.idl'ソースファイル群を作成したので、それらの各々をコンパイルしましょう。

実のところ、以下がそれを行なうコマンドです。

@bash or CMD ソースコード
%the LibreOffice or Apache OpenOffice product directory%/sdk/bin/idlc -w -C -I%the LibreOffice or Apache OpenOffice product directory%/sdk/idl -I%an additional UNOIDL sources base directory% -I%another additional UNOIDL sources base directory% -O%the output directory% %the source file%

Objector 60B
. . . それじゃあ、そこにそんなコマンドがあるのね。

Hypothesizer 7
あなたがLibreOfficeまたはApache OpenOffice SDKをインストール済みである場合に限ります。

Objector 60B
はあ?何それ?

Hypothesizer 7
それをインストールする方法は、以前の記事にあります(Linux用またはWindows用)。

Objector 60B
あっ、そう。

Hypothesizer 7
とにかく、生成された'UNOデータタイプのマージされていないファイル群'を1つの'UNOデータタイプのマージされたファイル'へアーカイブしなければなりません、以下のようにして。

@bash or CMD ソースコード
%the LibreOffice or Apache OpenOffice product directory%/regmerge %the output file% /UCR %a UNO datum type unmerged file% %another UNO datum type unmerged file%


5: 'UNOデータタイプのマージされたファイル'を登録する


Hypothesizer 7
その'UNOデータタイプのマージされたファイル'を登録します。

2つの方法があります: 1) それを'%LibreOfficeまたはApache OpenOfficeのプロダクトディレクトリ%/program/types'ディレクトリに置く 2) それを拡張機能を介して登録する。

Objector 60A
それをそこへただコピーすればいいのか?

Hypothesizer 7
もしくは、そこへシンボリックリンクを作成してもよいです、しかし、いずれにせよ、LibreOfficeまたはApache OpenOfficeのインスタンスをリスタートする必要があります。

方法2のためには、'UNOデータタイプのマージされたファイル'を当該構造内に入れ込んで当該マニフェストに1つのノードを追加します、以下のように。

@XML ソースコード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
	~
	<manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-typelibrary;type=RDB" manifest:full-path="theBiasPlanet.test.unoExtension.rdb"/>
	~
</manifest:manifest>

Objector 60A
それは、他の拡張機能から可視なのか?

Hypothesizer 7
いいポイントです。実のところ、それはグローバルに可視です。


6: マッピングイメージ群を生成する



6-1: Javaへのマッピングイメージ


Hypothesizer 7
当該'UNOデータタイプのマージされたファイル'に格納されたUNOインターフェイス群の、Javaへのマッピングイメージ群を生成するためには、以下のようなコマンドを実行します。

@bash or CMD ソースコード
%the LibreOffice or Apache OpenOffice product directory%/sdk/bin/javamaker -nD -X%the LibreOffice or Apache OpenOffice product directory%/program/types.rdb -X%the LibreOffice or Apache OpenOffice product directory%/program/types/offapi.rdb %the UNO datum types merged file% -O%the output base directory%

Objector 60A
. . . それだけか?

Hypothesizer 7
それだけです、しかし勿論、生成されたクラスファイル群は、それらを必要とする任意のプログラムから参照されなければなりません。

Objector 60B
「参照され」る?どうやったら「参照され」られるわけ?

Hypothesizer 7
もしも、あなたのプログラムが'LibreOfficeまたはApache OpenOffice JVM内'プログラムであれば、2つの方法があります: 1) 生成されたクラスファイル群Jarファイルを、Linuxでは'%LibreOfficeまたはApache OpenOfficeプロダクトディレクトリ%/program/fundamentalrc'内、Windowsでは'%LibreOfficeまたはApache OpenOfficeプロダクトディレクトリ%\program\fundamental.ini'内、の'URE_MORE_JAVA_TYPES'アイテムに登録する 2) 生成されたクラスファイル群を拡張機能JarファイルまたはマクロJarファイルに含める。

Objector 60B
「生成されたクラスファイル群Jarファイル」?そんなの持ってないけど。

Hypothesizer 7
ご自分で作成していただく必要があります。

とにかく、注意すべきは、拡張機能JarファイルまたはマクロJarファイル内のクラスは、その拡張機能またはマクロ内においてのみ可視であることです。

Objector 60B
それじゃあ、複数の拡張機能から参照されるべきクラスは、方法1で登録すべきだと?

Hypothesizer 7
または、そのクラスファイルを複数の拡張機能Jarファイルに入れてもよいです。

Objector 60B
私のプログラムが'LibreOfficeまたはApache OpenOffice JVM内'プログラムでなかったらどうなの?

Hypothesizer 7
それは、あなたのプログラムは独立プログラム、例えばUNOクライアント、であるということのはずです。その場合は、勿論、それは、単にクラスパスをセットするという問題です。


6-2: C++へのマッピングイメージ


Hypothesizer 7
当該'UNOデータタイプのマージされたファイル'に格納されたUNOインターフェイス群の、C++へのマッピングイメージ群を生成するためには、以下のようなコマンドを実行します。

@bash or CMD ソースコード
%the LibreOffice or Apache OpenOffice product directory%/sdk/bin/cppumaker -nD -X%the LibreOffice or Apache OpenOffice product directory%/program/types.rdb -X%the LibreOffice or Apache OpenOffice product directory%/program/types/offapi.rdb %the UNO datum types merged file% -O%the output base directory%

この場合、生成されるものはヘッダーファイル群です。

Objector 60B
変ねえ: C++へのマッピングイメージはソースファイルだなんて、Javaへのマッピングイメージはバイナリファイルなのに . . .

Hypothesizer 7
実のところ、それは理に適っています: C++クラスは青写真であって、オブジェクト的オブジェクトでは無いので、マッピングイメージはオブジェクトファイル内には存在できません。

Objector 60B
それじゃあ、生成されたヘッダーファイルへの参照は . . . どうしたらいいの?

Hypothesizer 7
ヘッダーファイルというものは、実行時に参照されるものではなく、コンパイル時にインクルードされるものなので、生成されたクラスヘッダーファイルファイル群は実行時に参照される必要はありません。


6-3: C#へのマッピングイメージ


Hypothesizer 7
当該'UNOデータタイプのマージされたファイル'に格納されたUNOインターフェイス群の、C#へのマッピングイメージ群を生成するためには、以下のようなコマンドを実行します。

@bash or CMD ソースコード
%the LibreOffice or Apache OpenOffice product directory%\sdk\bin\climaker -X %the LibreOffice or Apache OpenOffice product directory%\program\types.rdb -X %the LibreOffice or Apache OpenOffice product directory%\program\types\offapi.rdb %the UNO datum types merged file% -O %the output file% -r %the LibreOffice or Apache OpenOffice product directory%\sdk\cli\cli_basetypes.dll -r %the LibreOffice or Apache OpenOffice product directory%\sdk\cli\cli_oootypes.dll -r %the LibreOffice or Apache OpenOffice product directory%\sdk\cli\cli_uretypes.dll -r %the LibreOffice or Apache OpenOffice product directory%\sdk\cli\cli_cppuhelper.dll -r %the LibreOffice or Apache OpenOffice product directory%\sdk\cli\cli_ure.dll

Objector 60A
アセンブリが直接作成されるのか?

Hypothesizer 7
はい、C#には、個別のオブジェクトファイルなどというものはありませんから。

そして勿論、そのアセンブリはあなたのプログラムから参照されなければなりません、コンパイル時および実行時に。


6-4: Pythonへのマッピングイメージ


Hypothesizer 7
Python用には、マッピングイメージを生成するオペレーティングシステムコマンドはありません。

Objector 60A
はあ?Pythonでは作ったUNOインターフェイスを使えないのか、それじゃあ?ちくしょう!見下げはてたやつらだ!

Hypothesizer 7
落ち着いてください、サー。それらをPythonで使うことはできます、マッピングイメージ群をダイナミックに生成することによって。

Objector 60A
「ダイナミックに」とはどういう意味だ?

Hypothesizer 7
以下のPythonコードは、マッピングイメージを生成します。

@Python ソースコード
import uno

XTest: Any = uno.getClass ("theBiasPlanet.unoDatumTypes.test.XTest")

Objector 60A
. . . その「XTest」は「theBiasPlanet.unoDatumTypes.test.XTest」なるクラスを格納しているのか?

Hypothesizer 7
はい、しております。

Objector 60A
. . . それはどのように使えるのだ?

Hypothesizer 7
実のところ、任意のリモートUNOオブジェクトを操作するのに、それを明示的に使用する必要はありません、Python UNOはその作業を内部的に行ないますから。UNOコンポーネント(典型的には、リスナー)をPythonにて作成するためには、そのクラスをあなたのUNOコンポーネントのスーパークラスとして使うことができます(そしてそうしなければなりません)、以下のようにして。

@Python ソースコード
from unohelper import Base as UnoBase

class Test1Test (UnoBase, XTest):
	~


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>