■ exeが異なるPGM間での値の受け渡し

[Delphi Q & A 掲示板] [過去ログの一覧]


DDD 2009/03/03(火) 18:40:54 <初心者>
いつも参考にさせていただいております。
環境はDelphi2006です。


exeが異なるプログラム間で、
editに入力された値をPGM1からPGM2へ受け渡す
処理を行っています。

同じPGM内でフォームが異なる場合は
分かるのですが、(当たり前ですみません)
上記の場合の方法が分からず困っています。

もしお分かりの方がいらっしゃいましたら、
宜しくお願い致します。

一度きりの復活 2009/03/03(火) 18:51:01
http://mrxray.on.coocan.jp/Delphi/plSamples/650_SendText.htm
http://mrxray.on.coocan.jp/Halbow/Notes/N012.html
http://www2.big.or.jp/~osamu/Delphi/tips.cgi?index=90

こんなところで。

表裏 未里 [HomePage] 2009/03/03(火) 20:25:04 <初心者>
wm_userを調べると幸せになれるかもしれません(^^)

どやさ 2009/03/04(水) 10:12:15 <常連>
わたしは初心者のころには
WM_COPYDATA を使ったプロセス間通信を使ってました。

初心者のころはここ(TIPS)をよく見てまねてました。
はじめのころはこういったサイトを知っていると意外と役に立ちます。
http://www.wwlnk.com/boheme/delphi/tips/

該当するプロセス間通信はこれですね。
http://www.wwlnk.com/boheme/delphi/tips/tec1630.htm

DDD 2009/03/06(金) 19:02:24 <初心者>
皆様、ご解答本当にありがとうございました。
返事が遅くなり、申し訳ありません。

提示してくださったURLを参考に
開発を行ったのですが、受け取る側のFormを
うまく探しにいけていないようです。

ためしに自分自身を呼び出して処理を流したところ
うまくいったので、流れ自体は出来ていると思われます。

どやささんのURLに書かれている以外に
何か付け足すことはあるでしょうか。
作ったアプリケーションはどちらも同じ環境です。

よろしくお願い致します。

うんと 2009/03/07(土) 23:06:41
<どやささんのURLに書かれている以外>のはなぜ参考にしないのかを教えてください。 >DDDさん

D 2009/03/08(日) 18:17:47
送信側と受信側で同じクラス名のフォームだとFindWindowは使えないのでそれが原因なのではないかなぁ、と。

もしそうなら送信側と受信側のクラス名を違うものにするか、あるいはFindWindowではなくEnumWindowsを使って受信側のフォームを探すとかでしょうか。


function ClassNameGet(hHandle: HWND): String;
//ウィンドウハンドルhHandleのクラス名を返す
const
  lci_LEN = 256;
var
  lp_Buff: PChar;
begin
  Result := '';
  lp_Buff := AllocMem(lci_LEN +1);
  try
    GetClassName(hHandle, lp_Buff, lci_LEN);
    Result := String(lp_Buff);
  finally
    FreeMem(lp_Buff);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
  function FindReceiver(hWindow: HWND; hHandle: LPARAM): BOOL; stdcall;
  begin
    Result := True;
    if (hWindow <> HWND(hHandle)) then begin
      if (ClassNameGet(hWindow) = 'TForm1') then begin
        {
         送信処理を書く
        }

        Result := False; //複数に送信するならコメントアウト
      end;
    end;
  end;
begin
  EnumWindows(@FindReceiver, LPARAM(Handle));
end;

こんな感じで。

D 2009/03/08(日) 18:39:01
訂正。

function FindReceiver(hWindow: HWND; hHandle: LPARAM): BOOL; stdcall;
begin
  Result := True;
  if (hWindow <> HWND(hHandle)) then begin
    if (ClassNameGet(hWindow) = 'TForm1') then begin
      {
       送信処理を書く
      }

      Result := False; //複数に送信するならコメントアウト
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@FindReceiver, LPARAM(Handle));
end;

monaa 2009/03/09(月) 13:10:58
FindWindowはクラス名かwindow名が分かっているときにそのハンドルを探す関数ですから、送信相手のクラス名、Window名が同じ時は別の方法でハンドルを取得しないといけません。
テストするだけならWindow名を適当に変えたらどうですか?

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library