Einzelnen Beitrag anzeigen

Drag0n

Registriert seit: 15. Okt 2008
4 Beiträge
 
#1

ClientSocket in DLL ... Winsocket Error 10093

  Alt 15. Okt 2008, 14:37

Hallo erstmal.
Bin neu hier

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

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.
  Mit Zitat antworten Zitat