Category:
Xojo
すごいニッチな話なので日本語で書いても誰の役にも立たないんだろうなぁと思いつつ備忘録として。
クロスプラットフォーム開発環境の Xojo には Windows の ActiveX オブジェクトに対するネイティブバインディングを OS に登録済みのタイプライブラリから自動生成する機能があります。が、この自動生成された ActiveX クラスを、他のクラスのメソッドシグネチャの引数型やプロパティ型として使用すると、そのアプリは Windows 以外の環境で利用できなくなります。当該メソッドやプロパティが実際に使用されているかどうかは関係なく、そのメソッドやプロパティが属するクラスが Windows 以外のプラットフォームで参照される場合はアウトです。これは、
当該クラス → 当該クラスのメソッド/プロパティ → 生成した ActiveX クラス → 生成した ActiveX クラス内のメソッド → COM モジュールの External Method →
という順で芋蔓式にリンク依存性を持つためです。イントロスペクションが存在する以上、全てのメソッドがランタイムでコールされる可能性があるので、理屈としてはまぁ分かるのですが、不便極まりない。
実際にこのようなアプリを Mac 向けにビルドした場合、ビルド自体は成功しますが、実行時に
で、解決策として「生成した ActiveX クラス内のメソッド」と「COM モジュールの External Method」の依存関係を断ち切る COMProxy という小さなモジュールを公開しました。自動生成した ActiveX モジュールへ手を入れる必要があるのが難点ですが、修正は一括置換できる範囲、かつタイプライブラリが変更される機会はそう多くないので、運用としてもなんとか回るかなと思います。
この問題は今年の 1 月に Xojo にフィードバックし (Feedback Case #31791)、テスト担当者にも Verify して貰っているのですが、現時点では進展が無いようです。Xojo のライセンスをお持ちの方 (で同じ問題でお悩みの方)、ぜひ My Top Cases への登録をお願いします。
クロスプラットフォーム開発環境の Xojo には Windows の ActiveX オブジェクトに対するネイティブバインディングを OS に登録済みのタイプライブラリから自動生成する機能があります。が、この自動生成された ActiveX クラスを、他のクラスのメソッドシグネチャの引数型やプロパティ型として使用すると、そのアプリは Windows 以外の環境で利用できなくなります。当該メソッドやプロパティが実際に使用されているかどうかは関係なく、そのメソッドやプロパティが属するクラスが Windows 以外のプラットフォームで参照される場合はアウトです。これは、
当該クラス → 当該クラスのメソッド/プロパティ → 生成した ActiveX クラス → 生成した ActiveX クラス内のメソッド → COM モジュールの External Method →
oleaut32.dll
という順で芋蔓式にリンク依存性を持つためです。イントロスペクションが存在する以上、全てのメソッドがランタイムでコールされる可能性があるので、理屈としてはまぁ分かるのですが、不便極まりない。
実際にこのようなアプリを Mac 向けにビルドした場合、ビルド自体は成功しますが、実行時に
/System/Library/Frameworks/oleaut32.framework
が見つからない、というエラーでアプリが起動しません。で、解決策として「生成した ActiveX クラス内のメソッド」と「COM モジュールの External Method」の依存関係を断ち切る COMProxy という小さなモジュールを公開しました。自動生成した ActiveX モジュールへ手を入れる必要があるのが難点ですが、修正は一括置換できる範囲、かつタイプライブラリが変更される機会はそう多くないので、運用としてもなんとか回るかなと思います。
この問題は今年の 1 月に Xojo にフィードバックし (Feedback Case #31791)、テスト担当者にも Verify して貰っているのですが、現時点では進展が無いようです。Xojo のライセンスをお持ちの方 (で同じ問題でお悩みの方)、ぜひ My Top Cases への登録をお願いします。
Comments