![]() |
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. |
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. |
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 10:45 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