簡単なプラグイン – ReloadPlugins

簡単なプラグイン – ReloadPlugins

開発環境:Xcode7.3.1 Mac OS 10.11.6

サンプルコードの中でも簡単なコードでということで。ReloadPluginsを見てみます。これはプラグインの中でも最小のスクリプトで記述されていると思います。メニューに表示されて、選択したらプラグインを再読み込みしてくれるのです。
X-Planeをいちいち再起動しないで済むので開発においては必須のプラグインです。しかしこれ、X-Plane10ではうまく動作しません。11の方は非常に快適に動作してくれます。ですから今はX-Plane 11が開発環境になっています。10の場合は再起動が必要です(時間が勿体無い)。
スクリプトの記述は最低でもこれだけは必要だということになります。そしてこれがX-Planeプラグインの基本構造でもあります。

ReloadPluginsをここから

プロジェクトを立ち上げると以下のような警告が出ます

これをクリックして出たダイアログの一番下の「Perform Changes」をクリックで警告が消えます。

29行目の最後の”Reload plugins”と80行目の”Reload plugins”これがリンクしていて、メニューを選択したらXPLMReloadPlugins(); を実行するようになっています。そして、何も記述されていない関数もありますが、必ずこれだけをセットとして記述する必要があるようです。

私も完全なプログラミングの専門家ではないので、かなり曖昧な説明になっていますが、何度も変更を加えて動作を確認しながら勉強するというド素人のやり方で今日まで来ています。間違って説明している場合もあるので、あくまで参考ということで。

#include <string.h>
#include "XPLMPlugin.h"
#include "XPLMMenus.h"
 
static void MyMenuHandler(void * mRef, void * iRef);
 
/*
 * XPluginStart
 * 
 * スタートルーチンはウィンドウを登録し、その他の初期化を行います。
 * 
 */
PLUGIN_API int XPluginStart(
      char *  outName,
      char *  outSig,
      char *  outDesc)
{
     
 XPLMMenuID id;
 int   item;
 
 strcpy(outName, "ReloadPlugins");
 strcpy(outSig, "xplanesdk.sandybarbour.ReloadPlugins");
 strcpy(outDesc, "A plugin that allows plugins to be reloaded.");
    
 item = XPLMAppendMenuItem(XPLMFindPluginsMenu(), "ReloadPlugins", NULL, 1);
 
 id = XPLMCreateMenu("ReloadPlugins", XPLMFindPluginsMenu(), item, MyMenuHandler, NULL);
 XPLMAppendMenuItem(id, "Reload", (void *)"Reload plugins",1);
 
  
 
 //初期化に成功したことを示すには1を返す必要があります。それ以外の場合は、再び呼び出されません。
 return 1;
}
 
/*
 * XPluginStop
 *
 * クリーンアップルーチンは、ウィンドウの割り当て解除します。
 */
PLUGIN_API void XPluginStop(void)
{
}
 
/*
 * XPluginDisable
 * 
 * 無効のときは何もする必要はありませんが、しかしハンドラは提供する必要があります。
 */
PLUGIN_API void XPluginDisable(void)
{
}
 
/*
 * XPluginEnable.
 *
 * 有効化固有の初期化は行いませんが、この時点で有効にできることを示すためには「return 1」が必要です。
 */
PLUGIN_API int XPluginEnable(void)
{
 return 1;
}
 
/*
 * XPluginReceiveMessage
 * 
 * 受信メッセージハンドラ、ここでは何もする必要はありませんが、これを提供する必要があります。
 * 
 */
PLUGIN_API void XPluginReceiveMessage(
     XPLMPluginID inFromWho,
     int    inMessage,
     void *   inParam)
{
}
 
 
void MyMenuHandler(void * mRef, void * iRef)
{
 if (!strcmp((char *) iRef, "Reload plugins"))
 {
  XPLMReloadPlugins();    //これがプラグインをリロードするように命令する関数です。
 }
}