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


DDD  2009-03-04 03:40:54  No: 33527

いつも参考にさせていただいております。
環境はDelphi2006です。

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

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

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


一度きりの復活  2009-03-04 03:51:01  No: 33528

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

こんなところで。


表裏 未里  URL  2009-03-04 05:25:04  No: 33529

wm_userを調べると幸せになれるかもしれません(^^)


どやさ  2009-03-04 19:12:15  No: 33530

わたしは初心者のころには
WM_COPYDATA  を使ったプロセス間通信を使ってました。

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

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


DDD  2009-03-07 04:02:24  No: 33531

皆様、ご解答本当にありがとうございました。
返事が遅くなり、申し訳ありません。

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

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

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

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


うんと  2009-03-08 08:06:41  No: 33532

<どやささんのURLに書かれている以外>のはなぜ参考にしないのかを教えてください。  >DDDさん


D  2009-03-09 03:17:47  No: 33533

送信側と受信側で同じクラス名のフォームだと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-09 03:39:01  No: 33534

訂正。

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 22:10:58  No: 33535

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加