Delphi/C++Builder - TDdeClientConv の SetLink が失敗

Delphi/C++Builder - TDdeClientConv の SetLink が失敗

SetLink(ServiceName, TopicName) の第二引数に通常の変数を渡すと、メソッドが失敗する
↓失敗する関数
  1. function PostDDE_NG(const AppName, DdeService, DdeTopic, SendMacro: string): Boolean;  
  2. begin  
  3.     with TDdeClientConv.Create(nildo begin  
  4.         try  
  5.             ServiceApplication := AppName;  
  6.             ConnectMode := ddeAutomatic;  
  7.             if SetLink(DdeService, DdeTopic) then begin // ←失敗  
  8.                 try  
  9.                     Result := ExecuteMacro(SendMacro, True);  
  10.                 finally  
  11.                     CloseLink;  
  12.                 end;  
  13.             end;  
  14.         finally  
  15.             Free;  
  16.         end;  
  17.     end;  
  18. end;  
Topic を 'hogehoge' みたいに決め打ち指定するか const AAA = 'hogehoge'; したものを入れると関数は成功。 それじゃ、関数にした意味が無いので、PChar を介して指定すると、変数でもいけます
  1. function PostDDE(const AppName, DdeService, DdeTopic, SendMacro: string): Boolean;  
  2. var pDdeTopic: PChar;  
  3. begin  
  4.     pDdeTopic := StrAlloc(Length(DdeTopic) + 1);  
  5.     StrCopy(pDdeTopic, PChar(DdeTopic));  
  6.     try  
  7.         with TDdeClientConv.Create(nildo begin  
  8.             try  
  9.                 ServiceApplication := AppName;  
  10.                 ConnectMode := ddeAutomatic;  
  11.                 if SetLink(DdeService, StrPas(pDdeTopic)) then begin  
  12.                     try  
  13.                         Result := ExecuteMacro(SendMacro, True);  
  14.                     finally  
  15.                         CloseLink;  
  16.                     end;  
  17.                 end;  
  18.             finally  
  19.                 Free;  
  20.             end;  
  21.         end;  
  22.     finally  
  23.         StrDispose(pDdeTopic);  
  24.     end;  
  25. end;  
関数の使い方
  1. PostDDE('c:\TestApp.exe' { 送信先のアプリケーションパス },   
  2.         'TestApp' {一般的に実行ファイルの.exe を除いたもの },   
  3.         'TopicName' {サーバ側 TDdeServerConv の Nameプロパティ},  
  4.         'Macro Message');  
受け側アプリは TDdeServerConv コンポーネントを置いて、Nameプロパティを 'TopicName' の部分と同じに合わせれば、OnExecuteMacro イベントへ、'Macro Message' が受信される

コメント