0

Indy TCPサーバースレッドから(Uni)DDEサーバーに接続しようとしています。通常のアプリケーションから接続でき、PLC変数を取得/設定できます。

しかし、Indyスレッドから(Execute(AThread:TIdPeerThread)イベントから)同じコマンドを使用すると、SetLinkコマンドが失敗しました。

procedure ReadDDE(AppPath, Service, Topic, Cmd: string; out Eredmeny : string; out HibaSzint : string);
var
    DDE: TDDEClientConv;
    pc : PChar;
begin
    Eredmeny := '';
    HibaSzint := '';
    DDE := TDDEClientConv.Create(nil);
    try
        DDE.ConnectMode := ddeAutomatic;
        DDE.ServiceApplication := AppPath;
        DDE.FormatChars := False;
        HibaSzint := 'SetLink';
        if DDE.SetLink(Service, Topic) then begin
            HibaSzint := '';
            pc := DDE.RequestData(PChar(Cmd));
            Eredmeny := StrPas(pc);
            StrDispose(pc);
        end;
   finally
        DDE.Free;
   end;
end;

おそらく、DDEはWindowsメッセージを使用しているのでしょうか、それとも他のものがスレッドセーフではないのか、スレッドのレベルでキャッチできないのでしょうか。

これについての情報をありがとう:dd

4

2 に答える 2

1

DDEは、Windowsメッセージの上に構築されています。DDE接続のあるスレッドにメッセージがディスパッチされていることを確認する必要があります。

于 2013-02-25T12:25:24.190 に答える
0

手遅れだとは思いますが、誰かがこの指示を必要としているのかもしれません。私はそれにあまりにも多くの仕事をしました。同じ問題があります(ただし、Set Linkメソッドではなくopenlinkメソッドです。自動ではなく接続モードddeManualを使用しました)。ついに何かを見つけました。Delphi ddeMgrはVCLユニットにあり、Synchronize(yourProcedure)のように呼び出す必要があります。別のプロシージャ(そのプロシージャにはすべてのddeインタラクションが含まれます)を記述し、スレッドのExecuteメソッドで、Synchronizeを使用してプロシージャを呼び出しました。私のコードは次のようになります。

procedure TAskYTSThread.MakeDDEConv;
begin
 with TDDEClientConv.Create(Form1) do
 begin
    ConnectMode:=ddeManual;
    ServiceApplication:='explorer.exe';
    SetLink('Folders', 'AppProperties') ;
    Form1.Memo1.Lines.Add('Openlink çağrılacak Gönderilecek.');
    if OpenLink then
    begin
      Form1.Memo1.Lines.Add('Link Open Edildi.');
      ExecuteMacro('[FindFolder(, C:\)]', False) ;
      CloseLink;
    end
    else
    begin
      Form1.Memo1.Lines.Add('OLMADIIIIIII');
    end;
    Free;
  end;
end;

procedure TAskYTSThread.Execute;
var
  blnRunning : boolean ;
  FYtsTopicName, strMacro : string ;
begin
  inherited;
  FDDE_BUSY.Enter ;
  try
    blnRunning := IsYTSRunning;
    Synchronize(MakeDDEConv); // this is key point

  finally
    FDDE_BUSY.Leave ;
  end;
end;

この情報が他の人に役立つことを願っています:)

于 2015-07-27T00:44:00.947 に答える