アプリケーション間でデータを交換することが必要になる場合があります(たとえば、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_Exchangehttp://tmml.sourceforge.net/doc/tcl/dde.htmlPS:
DDEを使用して、Windows用のアプリケーションをテストし、エクスプローラー、Internet Explorer、Firefoxで作業します...
大規模プロジェクトのWin32 :: OLEでは、DBusの方が優れています。
将来、DDEは削除される可能性があります:)