|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
二重起動防止して、実行ファイルのショートカットアイコンなどに、たくさ
んのファイルをまとめてドロップして再起動する場合、それらのファイル名
だけは旧モジュールに、WM_COPYDATA メッセージで送信したいのですが、ど
うすればいいでしょう?
[A]
>[FAQ]二重起動防止でパラメータ送信(2A)
と同じことをやるのに、WM_COPYDATA メッセージを使ってみます。
[例]
まず、プロジェクトソースに、
>#22 SGM02275 七☆星 さん、[FAQ]Delphi2.0(Win32)での二重起動の防止
のコードを入れます。そのうち、再起動時の部分、
Wnd:=FindWindow('TCopDatF1',nil); // (**)
{クラス名で既にオーフ゜ンされているフォームを探します}
if Wnd<>0 then begin
{TApplicationのウィント゛ウハント゛ルを取得}
SetForegroundWindow(Wnd); {前面に移動してアクティフ゛化}
if ParamCount>0 then
// (*) WM_COPYDATA メッセージによる旧モジュールへの送信
CopyDataToOld(Wnd,ParamCount);
ここでは、別ユニットに、(*)の手続き CopyDataToOld() をコードし、
それを使っています。その内容は、
{=========================================================}
procedure CopyDataToOld(Wnd: HWnd;
aParamCount: integer);
var
pcData: PChar;
CDS: TCopyDataStruct;
begin
pcData:=StrAlloc(MAX_BUF1+1);
ParamsToData(aParamCount,pcData);
CDS.cbData:=MAX_BUF1+1;
CDS.lpData:=pcData;
SendMessage(Wnd,WM_COPYDATA,0,LongInt(@CDS));
StrDispose(pcData);
end; {CopyDataToOld}
そして受信側のフォーム、ここでは、(**)で指定したように、
Atoms2F フォームですが、そのフォームインスタンスの宣言部で、
type
TCopDatF1 = class(TForm)
(...略...)
private
{ Private 宣言 }
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
public
{ Public 宣言 }
(...略...)
と、WM_COPYDATAメッセージ応答関数を宣言します。この内容は、
{=========================================================}
procedure TCopDatF1.WMCopyData(var Msg: TWMCopyData);
var
pcData: PChar;
begin
pcData:=StrAlloc(MAX_BUF1+1);
StrCopy(pcData,PChar(Msg.CopyDataStruct^.lpData));
StringList1.Clear;
DropedStrs(pcData);
DragedToListBox1;
StrDispose(pcData);
end; {TCopDatF1.WMCopyData}
【補足】
(1) 未定義変数、関数、手続きに関する注意は、グローバルアトム2個の場
合の[FAQ]をご覧下さい。
(2) この方法で作成していたツールで、間断的に、メッセージが受信され
ない場合がありましたが、そのときのコードは消してしまい、同じように作
成しても再現しませんでした。その後、WM_COPYDATA 送受信で問題ありませ
ん。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|