![]() |
event in dll! Abfrage in Main?
Hallo
Wir verwenden vorgefertigte Funktionen (von APRO) für eine RS232 Kommunikation. Die APRO Komponenten stellen Funktionen zu Verfügung wie init_com_port(), send_string_via_rs232 und get_string_via_rs232. Das Problem liegt im Moment bei der get_string Funktion. Man kann einen Endstring definieren sobald dieser Endstring vom Gerät geschickt wird meldet sich die funktion get-string_via_rs232. Wenn man die Komponenten direkt in der Main Form verwendet ohne dll dann erkennt die Main Form den Event und meldet selbständig "string detektiert". Sobald wir aber die Funktionen in einer dll verwenden ist dieser Event nicht sichtbar. Etwas Code:
Delphi-Quellcode:
Wie detektiert man ob ein Event stattgefunden hat aus einer dll??
library strings_dll;
uses SysUtils, AdPacket, AdPort,Dialogs,Windows, Messages, Variants, Classes, Graphics, Controls, Forms, StdCtrls; type Tmyclass = class(TObject) procedure GetString(Sender: TObject; robotString: String); // Event private public end; var x,y:integer; datapacket1: TApdDataPacket; COM_port1: TApdComPort; myarray: array[0..5] of string; test2: array[0..5] of PChar; {$R *.res} procedure Tmyclass.GetString(Sender: TObject; robotString: String); begin showmessage('Endstring detected'); end; procedure init(); stdcall; begin datapacket1:=TApdDataPacket.Create(nil); // nill because we dont have a FORM ! myclass:=Tmyclass.Create; COM_port1:=TApdComPort.Create(nil); //init COM-port properties & events //--------------------------------------------- COM_port1.Open:=True; COM_port1.Baud:=115200; COM_port1.CommNotificationLevel:=10; COM_port1.DataBits:=8; COM_port1.DTR:=True; COM_port1.InSize:=4096; COM_port1.Logging:=tlOff; COM_port1.OutSize:=4096; COM_port1.Parity:=pNone; COM_port1.StopBits:=1; COM_port1.Tracing:=tlOff; COM_port1.RTS:=True; COM_port1.PromptForPort:=True; COM_port1.XOnChar:=#17; COM_port1.XOffChar:=#19; COM_port1.HWFlowOptions:=[]; COM_port1.SWFlowOptions:=swfNone; COM_port1.Tag:=0; COM_port1.AutoOpen:=True; COM_port1.BufferFull:=0; COM_port1.BufferResume:=0; //init all the datapacket properties & events //--------------------------------------------- datapacket1.AutoEnable:=True; datapacket1.Enabled:=True; datapacket1.StartCond:=scString; datapacket1.StartString:='?'; //Works!? datapacket1.EndCond:=[ecString]; datapacket1.EndString:=^M^J; //LF = ^J = #10 datapacket1.PacketSize:=100; datapacket1.TimeOut:=2184; //ca 2 min datapacket1.ComPort:=COM_port1; //userdefined com port datapacket1.IncludeStrings:=True; datapacket1.OnStringPacket:=myclass.GetString; // does not work ??? end; procedure close_t(); stdcall; begin COM_port1.Free; myclass.Free; datapacket1.Free; end; exports init, close_t; begin end. Gruss hum :cheers: [edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit] |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: event in dll! Abfrage in Main?
Wird das ShowMessage nicht ausgelöst in der Dll? Und exakt der gleiche Quelltext funktionert außerhalb einer DLL anders?
|
Re: event in dll! Abfrage in Main?
Könnte es sein das AsyncPro *irgendwelche* Fensterhandles benötigt um seine interne Fensterkommunikation zu ermöglichen?
Pack doch Testhalber mal Tmyclass in der DLL auch auf eine Formular welches du anzeigst |
Re: event in dll! Abfrage in Main?
Zitat:
Delphi-Quellcode:
unit RingBufferRW;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, AdPacket, OoMisc, AdPort; type TForm2 = class(TForm) procedure Init(Sender: TObject); private robotString: String; datapacket1: TApdDataPacket; COM_port1: TApdComPort; procedure GetString(Sender: TObject; robotString: String); protected public end; var Form2: TForm2; implementation {$R *.dfm} //------------------------------------------------------------------------------ procedure TForm2.Init(Sender: TObject); begin // com and datapacket end; procedure TForm2.GetString(Sender: TObject; robotString: String); begin showmessage('Ready (CR) received'); end; end. Es scheint schon was damit zu tun zu haben ob eine Form exisitert oder nicht. Besten Dank für weitere Ideen. Gruss hum |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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 by Thomas Breitkreuz