PerlおよびGUI。 アプリケーションの相互作用

アプリケーション間でデータを交換することが必要になる場合があります(たとえば、Internet Explorer、Excelでコマンドを実行する)。

Microsoft Windowsプラットフォームは、OLE、COM、... DDEなどのいくつかのメカニズムを提供します。



DDEは1987年に導入され、後にNetDDEのネットワーク実装があり、現在も使用されています。

DDEの操作は非常に簡単です。追加モジュールをCPANに接続する必要はありません。すべてがtkkitにあります。



受信者と送信者の2つのアプリケーションの例を考えてみましょう。



画像



habrakatの下の説明とコード。





動作するには、ddeパッケージを接続する必要があります



Tclでは、次のようになります。

パッケージにはddeが必要です




プログラムが情報を交換し始める前に、「私たちのサーバー」の名前を指定する必要があります。

それを「PerlDDE」にします



受信プログラムは、次の2つのコマンドをラップできます。

メッセージ-メッセージを表示する

画像



およびoops-ユーザーがクライアントプログラムを閉じたときに呼び出されます。

私たちの前にこのような悲しい絵があります:



画像



受信プログラムのコード:


 #!/ usr / bin / perl
厳格な使用;
機能 ':5.10'を使用します。
 Tkxを使用します。

 #作業用モジュールをDDEに接続します
 Tkx :: package_require( 'dde');

 #ハンドラーを設定する
 Tkx :: dde_servername(-handler => \&dde_handle、 'PerlDDE');

 #ウィンドウを作成する
 my%UI =();
 my $ mw = Tkx :: widget-> new( '。');

 $ mw-> g_wm_title( 'Perl / Tkx DDE');
 $ mw-> g_wm_minsize(qw(300 200));

 my $ label = $ mw-> new_ttk__label(-text => 'Receiver:');
私の$エントリ= $ mw-> new_ttk__entry(-textvariable => \ $ UI {entry}、
                                 -state => 'readonly');

 Tkx :: grid($ラベル、-row => 0、-column => 0、-sticky => 'ew'、-padx => 4、-pady => 4);
 Tkx :: grid($エントリ、-row => 1、-column => 0、-sticky => 'ew'、-padx => 4、-pady => 4);

 Tkx :: grid(columnconfigure => $ mw、0、-weight => 1);

 Tkx :: MainLoop();
 1;

 sub dde_handle {
    
     PROCESS_DDE_ARGS:
     foreach my $ ddeval(@_){
         next PROCESS_DDE_ARGS if ref($ ddeval);
        
         $ UI {entry} = $ ddeval;
         my($ key、$ value)= Tkx :: SplitList($ ddeval);
        
         given($キー){             
             when( 'message'){
                 Tkx :: tk ___ messageBox(
                     -title => 'DDE Receiver'、
                     -message => "受信したメッセージ:\ n $値"、
                 )長さ$値の場合;
             }
            
             when( 'oops'){
                 $ UI {entry} = 'エラー、送信者は終了しました';
             }
            
             #...
         }
     }
 }




送信者コード:


 #!/ usr / bin / perl
厳格な使用;
 Tkxを使用します。

 Tkx :: package_require( 'dde');

 my%UI;
 my $ mw = Tkx :: widget-> new( '。');
 $ mw-> g_wm_title( 'Perl / Tkx DDE');
 $ mw-> g_wm_minsize(qw(300 200));

 my $ label = $ mw-> new_ttk__label(-text => 'Sender:');
 my $ copy = $ mw-> new_ttk__label(-text => 'santeri.habrahabr.ru');
私の$ msg_e = $ mw-> new_ttk__entry(-textvariable => \ $ UI {msg});
私の$ msg_b = $ mw-> new_ttk__button(
     -text => 'Message :)'、
     -command => sub {
         send_message(メッセージ=> $ UI {msg});
     }、
 );

 Tkx :: bind($ msg_e => '<Return>'、sub {
     $ msg_b-> invoke();
 });

 #プログラムを閉じると
 $ mw-> g_wm_protocol(WM_DELETE_WINDOW => sub {
     send_message( 'oops');
     $ mw-> g_destroy();
 });

 Tkx :: grid($ラベル、-row => 0、-column => 0、-sticky => 'ew'、-padx => 4、-pady => 4);
 Tkx :: grid($ msg_e、-row => 1、-column => 0、-sticky => 'ew'、-padx => 4、-pady => 4);
 Tkx :: grid($ msg_b、-row => 1、-column => 1、-sticky => 'ew'、-padx => 4、-pady => 4);
 Tkx :: grid($ copy、-row => 2、-column => 0、-sticky => 'se'、-padx => 4、-pady => 4、
                   -columnspan => 2);

 Tkx :: grid(rowconfigure => $ mw、2、-weight => 1);
 Tkx :: grid(columnconfigure => $ mw、0、-weight => 1);

 Tkx :: MainLoop();
 1;

 #TclEval-TclのDDEサービス名
 sub send_message {
     my($ key、$ val)= @_;
     return if!定義された$キー;
    
     eval {
        私の$値= $ val ||  q {};
         Tkx :: dde_execute(TclEval => 'PerlDDE'、 "$ key {$ value}");  
     };
 }




参照:


http://en.wikipedia.org/wiki/Dynamic_Data_Exchange

http://tmml.sourceforge.net/doc/tcl/dde.html



PS:


DDEを使用して、Windows用のアプリケーションをテストし、エクスプローラー、Internet Explorer、Firefoxで作業します...

大規模プロジェクトのWin32 :: OLEでは、DBusの方が優れています。



将来、DDEは削除される可能性があります:)






All Articles