Registriert seit: 15. Okt 2008
4 Beiträge
|
ClientSocket in DLL ... Winsocket Error 10093
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.
|
|
Zitat
|