Archive for the ‘Softferkelei’ Category

Zugriffsverletzungen Delphi 5, PCAnywhere, Remote Access

Dienstag, März 9th, 2010

Delphi 5 (evt auch höhere Generationen) hat einen üblen Effekt, wenn man die Rohinstallation ohne Update als Entwicklungsumgebung nutzt.

Es ist uns reproduzierbar gelungen, nachzustellen, dass der Zugriff über PCAnywhere bei Erzeugung einer neuen Form (ein reines „Showmessage“ genügt) zu einer dauerhaften Zugriffsverletzung in der Applikation führt. Eine einfache Anwendung (Standard Form, mit Standard Button, der als Ereignis ein Showmessage „Hello World“ erzeugt) zeigt in diesem Fall folgendes Verhalten:

– Programmstart: Alles normal, Betätigen des Button erzeugt das gewünschte Fenster

– Einwahl mit PCAnywhere erfolgt: Die Anwendung läuft weiter, bis das erste Mal der Button gedrückt wird. In diesem Fall stürzt die Anwendung komplett ab. Auch ein Exceptionhandling für die Zugriffsverletzung schafft hier wenig Abhilfe, da die Zugriffsverletzung bis zum Neustart der Anwendung dauerhaft wiederkommt. Läuft die Anwendung im Delphi Debugger, stürzt die komplette Entwicklungsumgebung ab.

– Neustart der Anwendung, PCAnywhereeinwahl noch aktiv: Die Anwendung läuft normal weiter

– Beenden der PCAnywheresitzung: Ein Betätigen des Button führt wieder zur Zugriffsverletzung

Abhilfe schafft ein entsprechendes Update von Borland. Inwieweit das noch im Internet verfügbar ist, ist mir nicht bekannt.

Ob entsprechende Effekte auch mit höheren Versionen auftreten, ist nicht bekannt.

TClientSocket und Threads

Freitag, November 6th, 2009

Nur für mich, ums irgendwann wieder zu finden 🙂

Quellcode, der funktioniert:

procedure TLS_Logopak.Datensenden(sString: String); var Sockenstrom: TWinSocketStream;
DrClient : TClientSocket;
Buffer: Array [0..2000] of Char;
sResult : String;
bConnected : Boolean;
bSent      : Boolean;
begin
Sockenstrom := nil;
DrClient := nil;
bSent := false;
bAk := false;
bNAK := false;
bTimeOut := true;
bConnected := false;
try
DrClient := TClientSocket.Create (nil);
bTimeout := true;

with Drucker_Data.Drucker[_iDrucker_idx] do
begin
DrClient.Address    := sDrucker_IP ;
DrClient.Port       := iServer_Port;
DrClient.ClientType := ctBlocking;
DrClient.Active := true;
bConnected := true;
end;
except
on e: Exception do
begin
Trace (1,TRC_Logopak,'(Datensenden) Exception bei Connect %s‘,[e.Message]);
end;
end;

if bConnected then
begin
try
Sockenstrom := TWinSocketStream.Create (DrClient.Socket,2000);

Sockenstrom.Write (PChar(sString)^, Length(sString));
bSent := true;
except
on e: Exception do
begin
Trace (1,TRC_Logopak,'(Datensenden) Exception bei Write %s‘,[e.Message]);
end;
end;
if bSent then
begin
FillChar (Buffer, SizeOf (Buffer),0);
sResult := “;
if Sockenstrom.WaitForData (1000) then
begin
Sockenstrom.Read(Buffer,SizeOf(Buffer));
// Was damit machen
end;
end;
end;
if Assigned (Sockenstrom) then
begin
FreeAndNil(Sockenstrom);
end;
if Assigned (DrClient) then
begin
if DrClient.Active then DrClient.close;
FreeAndNil (DrClient);
end;
end;