伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか...がんばっても8割だ。

なでしこプラグインでFilemakerのスクリプト実行(できるといいな編)

この記事でやろうとしていることは、なでしこプラグイン自体が対応しちゃいました(^-^;
クジラ飛行机さんのパワーには圧倒されるばかり…

なでしこはWindowハンドルを使ってメッセージ送信などができる機能をばっちりそろえているので、
Filemakerのメニューバーの「スクリプト」に配置したスクリプトを実行できるといいな。と思う

まずは、本家なでしこで挑戦。


!WM_COMMAND = $00000111。
TARGETSCRIPT = 0。
TARGETSCRIPT = 32768 + TARGETSCRIPT。
TARGETWINDOWは、「ターゲットのウィンドウ」。
HANDLEは、「FMPRO7APP」を窓ハンドル検索。
TARGETHANDLEは、HANDLEのTARGETWINDOWを窓ハンドル内検索。
//PostMessage(TARGETHANDLE,WM_COMMAND,SETCOMMAND,0)。//←間違えていました!!
PostMessage(TARGETHANDLE,WM_COMMAND,TARGETSCRIPT,0)。//←こちらが正しいです。


●1行目
WindowsAPIで使う定数を定義します。

●2行目・3行目
メニューのスクリプトに割り当てられたスクリプトは、
上から順に「32768」「32769」「32770」…と「32768」から昇順にIDが振られています。
このIDを利用して、WindowMessageをPostMessageかSendMessageで送ってやればいいわけです。

●3行目~5行目
Filemakerのスクリプトは、データベースファイルごとに設定できます。
したがって、Filemakerのメインウインドウにメッセージを送ってしまうと、
別のファイルのサブウインドウがアクティブになるなどして、
期待していないスクリプトが起動してしまう可能性があります。
そこで、まず、「FMPRO7APP」でメインウインドウのハンドルを検索し、
その中の指定したタイトルを持つウインドウのハンドルを検索します。

●6行目
あとはこれまでのデータをもとにPostMessageしてやればOK。

ってわけで、本家なでしこでは問題なく動きました。
cnakoでは、PostMessage関数をDLLから先に呼び出しておく必要があります。


●PostMessage(hWnd,Msg,wParam,lParam) = dll("USER32.DLL",
"BOOL PostMessageA(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)")

大体こんな感じですかね。

さて、では早速これをなでしこプラグインで。。。。

と思ったら、、、、問題発生。

たとえば、これら命令をファイルメーカーのスクリプト中の計算式から呼び出すとします。
すると、スクリプトは現在起動中なのですから、
ウインドウメッセージを送ったところで、スクリプトの実行を受け付けてくれないみたいです。
「秒待つ」とかやっても、すべての命令が終わるまで、
NAKO_eval()関数は待ってくれる偉い子なので、意味がありません。
(いやイヤミではなく、本当に偉いと思う)

一番いいのは、1秒程度の間隔を設定し、1回だけ動作が行われるタイマーをつくり、
そのタイマーを起動してNAKO_eval()を抜けるのがラクそうなのですが、、、
(スクリプト終了後、タイマーが働いて指定したスクリプトを起動する。)
現在のバージョンではNAKO_eval()においてVNAKOが使えないので、
WIN32APIのSetTimer関数と、なでしこのイベント登録関数で切り抜けるしかなさそう。。。
(WM_TIMERを使うってことね。)

あれ?ちょっと待てよ。。。
もしかしたら、タイマー起動したら、Filemakerの動作がまずくなる???
そのまえにNAKO_eval()抜けられない罠とか????
しかし今日はもう時間切れ。。。(T_T)
週末にでもいじります。

タイマーが正常に動けば、
指定時間にダイアログ表示とか、スクリプト実行とかできるのになぁ。。。

ここまで書いて気づいた。
一番ラクなのは、なでしこで不可視のGUIアプリケーションを作って、
それをランタイム?ターミナル??サーバー???みたいにして、
COPYDATAとか使ってやり取りすればとりあえず切り抜けれるか。。。

7 Comments

  1. 先日、メール送信では有難うございました。
    多少関連するのですが、IWPからプラグインが受け付けない処理を、本家nakoで代替え処理すると、今度は外nakoからFMスクリプトを起動したくなります。
    この場合にこちらを利用させて頂きたく、テストしたのですが、素人の悲しさ、設定がマズいようでどうも上手く起動できません。

    !WM_COMMAND = $00000111。
    TARGETSCRIPT = 0。//←ここはスクリプトメニューの表示順番号、1番より任意の数字を指定?
    TARGETSCRIPT = 32768 + TARGETSCRIPT。//←ここで本来のス{リプト番号に持ち替え?
    TARGETWINDOWは、「ターゲットのウィンドウ」。//←ここは外ウインドウ名=FMアプリ名でなく、内ファイルウインドウのターゲットウインド名=ファイル名ですか?また、スペースや日本語変換処理必要?
    HANDLEは、「FMPRO7APP」を窓ハンドル検索。
    TARGETHANDLEは、HANDLEのTARGETWINDOWを窓ハンドル内検索。
    PostMessage(TARGETHANDLE,WM_COMMAND,SETCOMMAND,0)。//←引数SETCOMMANDは予約語で設定は不要か?TARGETSCRIPTの引数渡しは無しで良いか?

    以上、手すきの折でご教授下さいますか。

    PS:Macから投稿できない?もし投稿重複してたらごめんなさい。

  2. admin

    2008/12/4 木曜日 at 11:05:53

    >Hiroさん
    昨日はPCの前にいませんでした。すみません。
    コメントが表示されなかったのは、スパムフィルターにひっかかり承認待ちの状態でした。

    この記事を書いたすぐ後に、なでしこプラグインがスクリプト実行に対応したので、
    それ以来使っていないので、私もはっきりとは覚えていませんが、
    回答させていただきます。

    >TARGETSCRIPT = 0。//←ここはスクリプトメニューの表示順番号、1番より任意の数字を指定?
    ▲メニューの表示順で、最初が0になります。

    >TARGETSCRIPT = 32768 + TARGETSCRIPT。//←ここで本来のスクリプト番号に持ち替え?
    ▲ここでスクリプト番号、というより、Windowメッセージ用のIDに振り替えています。

    >TARGETWINDOWは、「ターゲットのウィンドウ」。//←ここは外ウインドウ名=FMアプリ名でなく、内ファイルウインドウのターゲットウインド名=ファイル名ですか?また、スペースや日本語変換処理必要?
    ここはウインドウタイトルを指定します。日本語の処理は特に必要がなかったように記憶していますが、なでしこの内部エンコードによってエンコード処理が必要かもしれません。そのあたりは試していただけると幸いです。

    >PostMessage(TARGETHANDLE,WM_COMMAND,SETCOMMAND,0)。//←引数SETCOMMANDは予約語で設定は不要か?TARGETSCRIPTの引数渡しは無しで良いか?
    申し訳ないです!!ここを書き間違えていました!
    「SETCOMMAND」になっている部分が正しくは「TARGETSCRIPT」ですね。
    ここだけ、自分の手元にあるプログラムをコピーしてきたままになっていたようです。
    TARGETSCRIPTに変更して実行すれば動くと思います。

  3. admin

    2008/12/4 木曜日 at 11:15:15

    >Hiroさん
    ちなみに、スクリプト番号のスタート値「32768」は、ファイルメーカーのバージョンによって違いがあるようです。
    この説明は9Advanceでの内容です。9Proは同等であろうかと思いますが、これ以外のエディションやバージョンでは差異があるかもしれませんので、なでしこのハンドル検索機能を使って、探してみてくださいね。

  4. Admin さま
    お忙しい折、早速回答頂き有難うございました。
    FMP9Aでアドバイスに則し試しましたら、すんなり動作してくれました。
    これで、内外の接触が可能になりましたので、FMはもとよりIWPでもかなりのことが出来そうです。ありがとうございました。

  5. 伊藤 さま

    先ほどは有難うございました。
    外部「なでしこ」から「FMスクリプト」が使えるようになると、欲が出てしまいました。
    スクリプト引数を付けてFMスクリプトを起動させることは可能でしょうか?

    もともと自由度のないIWPから「なでしこ」の高機能を使いたくてプラグインを導入したのですが、どうも使えないため、外部「なでしこ」へ一度振って回避すると言うアイデアとなった次第です。
    なので、FMスクリプトを使うケースは主にWeb非互換スクリプトだと思われるのです。例えば「メールを送信」スクリプトの場合を想定すると、メール送信情報がないとスクリプト自体、機能しようがありませんよね。そこで、メールIDみたいなもをスクリプトへ引数渡しすることが必要となってきます。

    先ご紹介いただいた「なでしこ」コードに「FMスクリプト引数」を追加送信するようには出来ませんでしょうか?
    もしお分かりでしたら、是非ご教授くださいませ。宜しくお願いいたします。

  6. admin

    2008/12/5 金曜日 at 18:05:06

    >Hiroさん

    この記事に書かれた方法は、擬似的にスクリプトメニューをクリックする方法ですので、引数渡しとなると、また別のイベントIDを探さなくてはいけません。

    実は同じことを考えたのですが、FMのウインドウ内ウインドウは一般的なWindowsGUIアプリとは異なる方法で実装されているらしく、そのIDを探すのを断念したという経緯があります。

    お力になれず申し訳ありません。

  7. 伊藤 さま

    お返事有難うございます。
    了解しました。やはり、この方法からは難しいですね。お手数をお掛けしました。

    取り合えず、素人丸出しのイージーさで、クリップボードを使って、急場はしのごうかと思います。

    また何か方法がございましたらご教授下さい。有難うございました。

コメントを残す

Your email address will not be published.

*