0

我尝试从 Indy TCP Server 线程连接到 (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

我知道为时已晚,但可能有人需要此指示。我为此做了太多的工作。我有同样的问题(但是openlink方法,而不是Set Link方法。我使用的连接模式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 回答