ホームページ開発ツール>Xojo Cocoa Plugin 覚書・基礎編

 Xojo Cocoa Plugin 覚書

基礎編

目次
 はじめに

 Cocoaのプラグインについては、既に別記事でも触れてはいるのですが、
 (1) Warning対策が不十分だった。
 (2) 以前作ったMach-O対応版(Carbon版)と同等の機能を持つCocoa版を作ってみたい。
等の理由から、改めて実験を行って、その結果を纏めておくことにしました。


 テスト環境

 ・Mac mini mid 2010 (intel)
 ・Mac OS X 10.9.4
 ・Xojo 2014 Release 2
 ・Xcode 5.1.1


 基本方針
  1. プラグインの作成にはXcodeを使用する
     ただし、Xcodeだけで直接プラグインを作成することはできません。
     Xcodeはdylib形式でのビルド迄で、その後、Xojoが提供するコンバートツールでpbx形式に変換することになります。

  2. ひな形は自分で用意する
     以前は、新規プロジェクトが作成し易いよう、Plugins SDK内にXcode用のテンプレートが用意されていたのですが、最近のものには添付されていないようです。
     なのでここでは、(以前の記事でも触れたように)Examplesフォルダ内のHostedPluginExampleをベースに使いました。
     具体的な作業内容は、次項の「dylibをビルドする」で記述します。

  3. Warningは対策する
     以前の記事では、Warningは敢えて無視しましたが、全て対策することを目指します。
     ただし、一点注意することがあります。
     添付のXcodeプロジェクトを5.1.1で開くと、以下の様にアップデートを促すWarningが出ます。

     この対策を実行してしまうと、Xojo側からプラグインのエントリーが見えなくなってしまいます。
     これは、アーキテクチャが「Standard Architectures (64-bit Intel) (x86_64)」に変更されてしまうのが原因のようで、ここだけ元々の「32-bit Intel (i386)」に戻してやれば、再び見えるようになります。

  4. MethodはやめてModuleを使う
     Mach-O版でこれまで使ってきた「Method」は、既にDeprecatedなので、別のものを使う必要があります。
     ざっと検索してみたところ、Moduleを使え、という感じだったので、Moduleを使ってみることにしました。
     なお、Moduleは、Methodの他にPropertyやConstantも持てるようになっていますが、ここでは使わないので、以下はMethodのみの記述となっています。

 dylibをビルドする

 今回は、プラグイン作成ルートの確定が目的なので、処理内容は(以前の記事と同じく)「与えられた二つの文字列を連結して返す」という、極めてシンプルなものとしました。

 まずはXcodeを用いてdylibを作成します。手順は以下の通りです。
  1. Xojo 2014 Release 2/Extras内のPluginsSDKフォルダを、適当な場所にコピー
  2. Examplesフォルダ内のHostedPluginExampleフォルダを複製し、適当な名前(ここでは、PluginModule1)にリネーム
  3. HostedPluginExample.xcodeprojをXcode 5.1.1で開く
  4. REALExampleLevelIndicator.hとREALExampleLevelIndicator.mmを削除
  5. プロジェクト名をPluginModule1にリネーム(やり方は、例えば参考サイト(1)を参照。Project NameとManage Schemes..のみ必須。)
  6. HostedPluginExample.cppをPluginModule1.cppにリネーム(ファイル名選択後、もう一度クリックして名前を変更)
  7. ここでプロジェクトを一旦閉じ、再び開く(そうしないと、名前の変更がビルドの結果に正しく反映されない場合がある。)
  8. 前項のWarning対策
  9. PluginModule1.cppの中身を全文削除後に、以下をペースト
    #include "rb_plugin.h"
    
    static REALstring CatString( REALstring str1, REALstring str2 );
    
    REALmethodDefinition PluginModule1Methods[] = {
    	{ (REALproc)CatString, REALnoImplementation, "CatString(str1 as string, str2 as string) as string", REALconsoleSafe | REALScopeGlobal },
    };
    
    REALmoduleDefinition PluginModule1Definition = {
    	kCurrentREALControlVersion,
    	"PluginModule1",
    	PluginModule1Methods,
    	sizeof( PluginModule1Methods ) / sizeof( REALmethodDefinition ),
    	nil,  // PluginModule1Constants,                                      --> No Use
    	nil,  // sizeof( PluginModule1Constants ) / sizeof( REALconstant ),   --> No Use
    	nil,  // PluginModule1Properties,                                     --> No Use
    	nil,  // sizeof( PluginModule1Properties ) / sizeof( REALproperty ),  --> No Use
    };
    
    static REALstring CatString( REALstring str1, REALstring str2 ) {
    	NSString* nsstr1 = (NSString *)REALCopyStringCFString(str1);
    	NSString* nsstr2 = (NSString *)REALCopyStringCFString(str2);
    	
    	NSString* nsstr3 = [NSString stringWithFormat:@"%@ %@",nsstr1, nsstr2];
    	const char* cstr3 = [nsstr3 UTF8String];
    	
    	return REALBuildString(cstr3, ::strlen(cstr3));
    }
    
    void PluginEntry( void ) {
    	REALRegisterModule( &PluginModule1Definition );
    }
    
    注1)前回使用したREALCStringはDeprecatedなので、REALCopyStringCFStringに変更した。
    注2)Cocoa以外のAPIを混在させる場合は、Cocoa部分を#if COCOA〜#endifで囲む。今回はCocoa以外の利用は考えていないので、何もしていない。
  10. まずCleanを実行
  11. 次にBuildを実行
 DerivedData/PluginModule1/Build/Products/Debug に libPluginModule1.dylib ができていればOK。


 pbx形式に変換する

 上記ステップで作成したdylibをpbx形式に変換します。
 変換にはPlugin Converterを用います。
  1. libPluginModule1.dylib(作成場所は前項参照)を、以下の構成をもつフォルダにコピーする。
    (詳細は、Plugin SDK内のPluginPackaging.rtf、Plugin Converter内のPlugin Converter Read Me.txtを参照)
    +- PluginModule1                       // Folder
        +- Build Resources                 // Folder
            +- Mac Cocoa                   // Folder ( for Cocoa )
                +- libPluginModule1.dylib  // dylib
    
  2. Plugin SDK/Plugin Converter/Plugin Converter.rbpで、プラグイン形式(rbx)に変換
    (コンソールアプリのライセンスを持っていなくても実行は可能。「-f <フォルダへのパス>」は「共有>Debug>Command Line Arguments」で指定。)
  3. できたPluginModule1.pbxをXojoのpluginsフォルダに移動する。

 動作テストする

 動くかどうか、テストします。
  1. Xojoを起動する。
  2. Window1にPushButtonを置き、Actionイベントに以下を記述。
    MsgBox PluginModule1.CatString("Hello","World")
    
     注)メソッドではメソッド名のみの記述だったが、モジュールは「モジュール名.メソッド名」となる。
  3. 実行する。
  4. PushuButtonを押す。ダイアログに「Hello World」と表示されればOK。

 おわりに

 今回は基礎編ということで、まずは「プラグイン作成ルートの確定」について書き留めました。
 ルートが確定すれば、内容に集中することができます。
 内容については、次回以降あらためて触れてみたいと思います。

 注)上述のサンプルはあくまで動作確認用で、配布を前提としたものではありません。(配布用とするにはいくつかの配慮が必要なようです。)


 お世話になったサイト

 貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):Xcode4のプロジェクト名変更方法 : NAGAOKA STATION


 更新履歴

 2014.08.09 新規作成


[Home]  [MacSoft]  [Donation]  [History]  [Privacy Policy]  [Affiliate Policy]