Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ClientSocket in DLL ... Winsocket Error 10093 (https://www.delphipraxis.net/122395-clientsocket-dll-winsocket-error-10093-a.html)

Drag0n 15. Okt 2008 13:37


ClientSocket in DLL ... Winsocket Error 10093
 

Hallo erstmal.
Bin neu hier :oops:

So und nun gleich zu meinem Problem....
Ich versuche eine DLL zu erstellen die einen Threat startet der einige Funktionen ausführen soll die auch schon ohne Probleme laufen
jedoch habe ich jetzt enen ClientSocket eingebaut. Alles funktioniert einwandfrei und ohne irgend welche Exceptions solange bis ich es in eine DLL packe, dann gibt er mir beim schliessen des Programms eine exception vom Typ Win-Socket-Error 10093 aber nur wenn ich vorher an den server Connecte

das Senden geht und empfangen auch halt nur das verlassen vom programm nicht es kommt mir so vor daß die finalization dann nicht ausführt aber da das dann in der dll steckt kann ich auch keinen debugger dran hängen oder zumindest weiß ich nicht wie :wall:

hier erstmal der Threat

Delphi-Quellcode:
unit Unit2;

interface

uses
  Classes,Windows,SysUtils,Graphics,Messages,
  Controls, StdCtrls,MSXML_TLB, comobj,ScktComp,IniFiles,ActiveX;

type
  TMyThreat = class(TThread)
  private
    FkKontrolle,FConnected : boolean;

    ClientSocket1: TClientSocket;
protected
    procedure Execute; override;

  public
    constructor Create;
    destructor Close;
    procedure Anhalten;
    procedure Fortsetzen;
    function Connect:boolean ;
    function SendReceive(SendString:string):string;
    {...}

  end;

var
  myt : TMyThreat;

implementation

const
  coding = 'utf-8';

constructor TMyThreat.Create;
begin
  inherited create(True);
  try
    CoInitialize(nil);
    FkKontrolle := true;
    fConnected := false;
    ClientSocket1 := TClientSocket.Create(nil) ;
  except end;
  resume;
end;

destructor TMyThreat.Close;
begin
  try
    CoUninitialize;
    ClientSocket1.Free;
    FkKontrolle := False;
    terminate;
    if suspended then resume;
    waitfor;
  except end;
end;

procedure TMyThreat.Anhalten;
begin
  if fkKontrolle and not suspended then
  begin
    suspend;
  end;
end;

procedure TMyThreat.Fortsetzen;
begin
  if suspended then
  begin
    resume;
  end;
end;

procedure TMyThreat.Execute;
begin
  try
    while not terminated do
    begin
      FkKontrolle := true;
      if not terminated then
      begin
        sleep(100);
        {....}
      end;
      FkKontrolle := False;
    end;
  except end;
end;

function TMyThreat.Connect:boolean ;
begin
  try
    with ClientSocket1 do
    begin
      active := false;
      ClientType := ctBlocking;
      Host:= '127.0.0.1';
      Port := 3580;
      active := true;
    end;
    result := true;
    FConnected := true;
  except
    on E: Exception do
    begin
      result:= false;
    end;
  end;
end;


function TMyThreat.SendReceive(SendString:string) : string;
var
    stream : TWinSocketStream;
begin
  try

    if Fconnected then
      with ClientSocket1 do
      begin
        Open;
        Socket.SendText(SendString+ #13#10 + #13#10);
        stream := TWinSocketStream.Create(Socket, 2000);
        if stream.WaitForData(1000) then
          result :=Socket.ReceiveText;
        stream.Free;
        CLose;
      end
    else
      result := 'No connection to server';
  except
    on E:Exception do
      result := 'Can not send string';
  end;
end;
initialization
if not Assigned(myt) then
  myt := TMyThreat.Create;

finalization
if Assigned(myt)then
  myt.Close;

end.

hab da schon mal alles rausgenommen bis nur noch das steht was den fehler Erzeugt

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, unit2,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    bSend: TButton;
    Panel1: TPanel;
    bConnect: TButton;
    procedure bSendClick(Sender: TObject);
    procedure bConnectClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.bSendClick(Sender: TObject);
var strTemp : string;
begin
  strTemp := myt.SendReceive(Edit1.Text);
  Panel1.Caption:= strTemp
end;

procedure TForm1.bConnectClick(Sender: TObject);
begin
  myt.Connect;
end;

end.

jetzt zur dll

Delphi-Quellcode:
library Project2;

uses
  SysUtils,Forms,
  Classes,Unit1;

var
  MyForm: TForm1;

{$R *.RES}

procedure OpenSetup;stdcall;
begin
  Application.CreateForm(TForm1, MyForm);
  MyForm.ShowModal;
end;

exports
  OpenSetup;
begin
end.

und zum schluss noch wie ich die dll dann verwende

Delphi-Quellcode:
unit Unit4;

interface
  procedure OpenSetup;

implementation
  procedure OpenSetup;
  external 'project2.dll'
end.

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, unit4;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenSetup;
end;

end.

bin für jeden hinweis und tipp zum besser machen dankbar da ich mich erst seid kurzem mit delphi befasse.

sirius 15. Okt 2008 14:07

Re: ClientSocket in DLL ... Winsocket Error 10093
 
Da der Constructor außerhalb des Threads ausgeführt wird und der Destructor innerhalb, dürftest du mit deinem coinitialize-counitialize-Paar Probleme haben. Pack die zwei mal um bzw. in die Execute-Methode!
Edit: Ähnliches gilt für den Socket und was du noch so hast.

Debuggen kannst du eine DLL, in dem du unter Start/Parameter die DLL mit einer Host-Anwednung verbindest.

Drag0n 15. Okt 2008 14:34

Re: ClientSocket in DLL ... Winsocket Error 10093
 

Danke!
hab auch gleich die coinitialize-counitialize umgepackt obwohl die eigentlich noch keine probs gemacht haben.

da nun das debuggen geht hab ich den fehler auch gleich gefunden nur versteh ich ihn nicht wirklich...

warum bringt er mir den Socket Fehler wenn ich die Connect funktion von der Unit1 mit einem ButtonClick ausführe aber wenn ich das Connect direkt in der SendRecieve Funktion ausführe nicht ?

Delphi-Quellcode:
{...}
try
  Connect;
  ifFConnected then {...}

wenn mir das jemand verständlich erklären kann bin ich wunschlos glücklich ... fürs erste :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz