![]() |
DdeClientConv bzw DdeClientItem in einer Dll
Hi Leute!
Ich möchte gerne durch eine Dll eine Abfrage über eine TDdeClientConv machen. Das Senden der Daten verläuft problemlos. Allerdings macht mir das Empfangen der Daten vom Server Probleme: Hier der Quelltext von der DLL:
Delphi-Quellcode:
Hier der Code von der Client-App:
uses
SysUtils, DdeMan, Windows, Classes; type TDummy = class (TForm) public class procedure DllClientItemChange(Sender: TObject); end; var DllClientConv : TDdeClientConv; DllClientItem : TDdeClientItem; MsgError : string; MsgResult : string; ServerResponse: boolean; {$R *.res} class procedure TDummy.DllClientItemChange(Sender: TObject); begin if DllClientItem.Lines.Count = 2 then begin MsgError := DllClientItem.Lines.Strings[0]; MsgResult:= DllClientItem.Lines.Strings[1]; end else if DllClientItem.Lines.Count = 1 then MsgError:= DllClientItem.Lines.Strings[0] else MsgError:= 'Error in server response!'; ServerResponse:= true; MsgError:= 'No Error'; end; function GetCredits(PcName, UserName: string; var CreditValue: string; var Error: string; TimeOut: integer = 100): boolean; var li1: integer; begin DllClientConv := TDdeClientConv.Create(nil); DllClientItem := TDdeClientItem.Create(nil); DllClientConv.Name := 'DLLClientConv'; DllClientItem.Name := 'DllClientItem'; DllClientItem.DdeConv := DllClientConv; DllClientItem.OnChange:= TDummy.DllClientItemChange; DllClientItem.DdeItem := 'CreditManagerServerItem'; result := DllClientConv.SetLink('Project1', 'CreditManagerServerConv'); ServerResponse := false; MsgError := ''; if result then begin DllClientItem.Lines.Add('GET_CREDITS'); DllClientItem.Lines.Add(PcName); DllClientItem.Lines.Add(UserName); result:= DllClientConv.ExecuteMacroLines(DllClientItem.Lines, true); if result then begin li1:= GetTickCount; while GetTickCount-li1 <= 5000 do begin if ServerResponse = true then Exit; end; if ServerResponse then begin try CreditValue:= DllClientItem.Lines.Text; Error := PChar(MsgError+'s'); except CreditValue:= '0'; result := false; Error := PChar('GET_CREDITS-value is not an integer'); end; end else begin CreditValue:= '0'; result := false; Error := PChar(MsgError); end; end; end; end; exports GetCredits; begin end.
Delphi-Quellcode:
Hier der Code von der Server-App:
function GetCredits(PcName, UserName: string; var CreditValue: PChar; var Error: PChar; TimeOut: integer = 100): boolean; external 'D:\Project1.dll';
procedure TForm1.Button1Click(Sender: TObject); var s1, s2: PChar; begin GetCredits(PChar('Test'), PChar('Test'), s1, s2, 100); ListBox1.Items.Add('New request: '+TimeTostr(now)); ListBox1.Items.Add('Value: '+s1); ListBox1.Items.Add('Error: '+s2); ListBox1.Items.Add('-------------------------------'); ListBox1.Items.Add(''); ListBox1.Selected[ListBox1.Items.Count-1]:= true; end;
Delphi-Quellcode:
Ist es überhaupt möglich oder hab ich etwas übersehen?
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DdeMan; type TForm1 = class(TForm) Button1: TButton; CreditManagerServerConv: TDdeServerConv; CreditManagerServerItem: TDdeServerItem; ListBox1: TListBox; Label1: TLabel; procedure CreditManagerServerConvExecuteMacro(Sender: TObject; Msg: TStrings); procedure Button1Click(Sender: TObject); procedure CreditManagerServerConvOpen(Sender: TObject); procedure CreditManagerServerConvClose(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.CreditManagerServerConvExecuteMacro(Sender: TObject; Msg: TStrings); begin if Msg.Text <> 'Recieved!' then begin ListBox1.Items.Add('New message recieved: '+TimeTostr(now)); ListBox1.Items.AddStrings(Msg); ListBox1.Items.Add('Response = 1234'); ListBox1.Items.Add('----------------------------'); ListBox1.Items.Add(''); ListBox1.Selected[ListBox1.Items.Count-1]:= true; CreditManagerServerItem.Lines.Add('1234'); CreditManagerServerItem.Lines.Add('No Error'); end else begin ListBox1.Items.Add('Last message recieved by client'); ListBox1.Items.Add('----------------------------'); ListBox1.Items.Add(''); end; end; Bin euch für eure Hilfe dankbar. |
Re: DdeClientConv bzw DdeClientItem in einer Dll
was genau macht Probleme ?
geht gar nix ? |
Re: DdeClientConv bzw DdeClientItem in einer Dll
Ich bekomm einfach keine Nachricht von der Server-Anwendung
|
Re: DdeClientConv bzw DdeClientItem in einer Dll
liegt der Fehler auf Server oder Client Seite ?
Was passiert, wenn Du per Objectinspektor auch DDEClientConv und DDEClientItem erstellst. Funktioniert es dann ? Es gab irgendwo mal auch so ein DDE Tool, womit man DDE Nachrichten einsehen konnte, die gerade im System verschickt werden. Ich grübel aber schon die ganze Zeit. Weiss nicht, wo das her war .. Die Eigenschaft "ServerConv" in DDEServerItem hast Du aber ordnungsgemäß zugewiesen oder ? |
Re: DdeClientConv bzw DdeClientItem in einer Dll
Die Fehler liegt daran, dass der Server problemlos die Nachricht sendet sie aber nicht in der Dll ankommt. Wie soll ich die beiden Komponenten TDdeClientConv und TDdeClientItem in einer Dll einfach erstellen? Das geht nun mal nur dynamisch.
|
Re: DdeClientConv bzw DdeClientItem in einer Dll
Zitat:
nein ! .. Du solltest ja probieren, ob der Code überhaupt generell funktioniert. in einer normalen Anwendung. Ich habe den Fall mit einer DLL noch nie probiert. Würde auch mal glatt behaupten, dass eine DLL gar keine Windows Messages System Nachrichten empfangen kann ! Weil eine DLL nutzt doch den Speicherbereich des aufrufenden Prozesses.... Desweiteren vermute ich, dass Dein Quelltext auch unter NICHT Dll Bedingungen nicht funktioniert. Denn um Events parallel zu einer Schleifenausführung zu emfpangen müsstest Du in Deiner Warte-While Schleife mindestens ein Application.processmessages einfügen oder mit Threads arbeiten. Warum muss es unbedingt eine DLL sein ? Und warum muss es unbedingt DDE sein ? Gruß stoxx |
Re: DdeClientConv bzw DdeClientItem in einer Dll
Moin!
Du übergibst und nutzt AnsiStrings und hast aber ShareMem nirgendwo als erste Unit eingebunden... ... mal so als Vermutung von mir... MfG Muetze1 |
Re: DdeClientConv bzw DdeClientItem in einer Dll
Was gäbe es denn sonst noch für Alternativen, um zwei Programme kommunizieren zu lassen? Ich meine außer über DDE?
|
Re: DdeClientConv bzw DdeClientItem in einer Dll
Sockets, OLE, WM_COPYDATA, Shared Memory (GlobalLock, etc), Files, ....
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz