Einzelnen Beitrag anzeigen

Logimator

Registriert seit: 28. Jul 2011
1 Beiträge
 
#1

Wie TClientSocket in einer dll verwenden ?

  Alt 28. Jul 2011, 15:34
Hallo,

ich möchte gernen in einer dll mittels TClientSocket von einem NTP-Server die Atomzeit erfragen, und diese mittels einer Funktion zurück geben. In einer normlen Delphi-App funktioniert das tadellos, nur sobald ich den Code in eine dll stecken möchte, funktioniert das nicht. Für mich sieht's so aus, als der TCLientSocket keinerlei Messages bekommt oder bearbeitet. Bin aber was dll's anbelangt absolut grün hinter den Ohren
Wäre echt nett, wenn mir jemand helfen könnte

Das hier ist meine dll ...

Code:
library NTPTest;

uses ShareMem,
  SysUtils,
  Classes,
  Dialogs, Forms, Windows,
  MainUnit in 'MainUnit.pas' {DataModule1: TDataModule};

{$R *.res}

begin
     IsMultiThread := TRUE;
     DataModule1:=TDataModule1.Create(nil);
end.

... und hier die zugehörige Unit, die die Arbeit erledigen soll ...
Die Funktion, die die Zeit liefern soll ist die GetNTPHour. Das lustige ist, wenn das ShowMessage in der Funktion einkommentiert wird, geht's einwandfrei. Sobald die ShowMessage kommentiert wird, geht's nicht mehr

Code:
unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ScktComp;

type
  TDataModule1 = class(TDataModule)
    TimeSocket: TClientSocket;
    procedure TimeSocketRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure TimeSocketError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure TimeSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }


  public
    { Public-Deklarationen }
    function GetNTPHour( myText: pchar): Integer; stdcall;
  end;

var
  DataModule1: TDataModule1;
  str_Act_Ation: String;
  Datum, Uhrzeit: string;

implementation

{$R *.dfm}



function TDataModule1.GetNTPHour( myText: pchar): Integer; stdcall;
var
   i_Hour: Integer;
    i: Integer;
   Zahl: Array [1..4] of Byte;
   Sekunden: Longword;
   Zeitzone: Real;
   DatumZeit: TDateTime;
begin


        TimeSocket.Host := 'ptbtime1.ptb.de';
        TimeSocket.Port := 37;

        TimeSocket.Open;

        //ShowMessage('In Function GetNTPHour' ) ; <-----  Wenn das einkommentiert ist, geht's

        Result := 1;
end;

procedure TDataModule1.TimeSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 i_Hour: Integer;
    i: Integer;
   Zahl: Array [1..4] of Byte;
   Sekunden: Longword;
   Zeitzone: Real;
   DatumZeit: TDateTime;
begin
        Socket.ReceiveBuf(Zahl, 4);
        // Bytes vertauschen
        for i := 1 to 4 do
           Sekunden := Sekunden * 256 + Zahl[i];

     //   Socket.Close;

        Zeitzone := 2/24; // Winterzeit: +1/24, Sommerzeit: +2/24;
        DatumZeit := EncodeDate (1900,1,1)    { 1.1.1900 }
                      + Sekunden/86400            { + Tage }
                      + Zeitzone;                { + Zeitzone gegenüber GNT }

        Datum := DateTimeToStr (trunc(DatumZeit));
        Uhrzeit := DateTimeToStr (DatumZeit);
        Delete (Uhrzeit,1,Pos(' ',Uhrzeit));

        ShowMessage('Datum: ' + Datum + ' Uhrzeit ' + Uhrzeit + ' Secs: ' + IntToStr( Sekunden) ) ;
end;

procedure TDataModule1.TimeSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
      ShowMessage('Error: ' ) ;
      ErrorCode := 0;
end;

procedure TDataModule1.TimeSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
          ShowMessage('Socket connect ' ) ;
end;

end.
  Mit Zitat antworten Zitat