Autor |
Beitrag |
Mordilion
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: So 09.12.07 15:35
Hallo liebe Gemeinde,
ich habe da so ein Problem wo ich schon mittlerweile 4 Tage mit zu tun habe.
Das Problem ist das ich bei der Verwendung der Synapse-Lib in einem Thread eine Zugriffsverletzung bekomme.
Folgende Thread-Methode verwendet das THTTPSend-Objekt von Synapse.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| function TQuellThread.GetHTTP(Quelle: TBaseQuelle; URI: string): string; var slTmp: TStrings; begin Result := '';
HTTP.Clear; HTTP.Timeout := Quelle.Sock_Timeout; HTTP.UserAgent := Quelle.Sock_UserAgent; if Length(Quelle.Sock_Referer) > 0 then HTTP.Headers.Add('Referer: ' + Quelle.Sock_Referer); HTTP.KeepAlive := Quelle.Sock_KeepAlive > 0; if HTTP.KeepAlive then HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive)); HTTP.Protocol := Quelle.Sock_Protocol; HTTP.Headers.Add(Quelle.Sock_HeaderExt.Text); if Quelle.Sock_Cookies.Count > 0 then HTTP.Cookies.Text := Quelle.Sock_Cookies.Text;
slTmp := TStringList.Create; try if HTTP.HTTPMethod('GET', URI) then begin slTmp.LoadFromStream(HTTP.Document); Result := slTmp.Text; end; finally slTmp.Free; end; end; |
Das erzeugen des Objektes geschieht im Constructor und das Freigeben natürlich im Destructor des Threads.
Die geneu Zeile wo es knallt kann ich leider nicht sagen, aber wenn ich eine andere Kompo verwende geht es.
Ich hoffe, dass mir jemand bei dem Problem helfen kann.
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: So 09.12.07 17:21
Habe mittlerweile herausgefunden, dass es irgendwie was mit dem Setzen von Strings zu tuen hat, aber wieso da eine Zugriffsverletzung kommt, weiß ich leider immer noch nicht.
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: So 09.12.07 18:49
Setz doch einfach mal einen Haltepunkt auf Result := ''
und gehe das ganze dann im Einzelschritt durch. Da bekommst du die genaue Zeile an der es knallt.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: So 09.12.07 19:38
Habe ich gemacht und es ist folgende Zeile:
Delphi-Quelltext 1:
| HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive)); |
[edit]
Habe nun mal diese Zeile auskommentiert, aber dann bleibt er mit der selben Fehlermeldung an folgender Zeile hängen:
Delphi-Quelltext 1:
| HTTP.Protocol := Quelle.Sock_Protocol; |
[/edit]
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mo 10.12.07 12:19
Also so langsam bekomme ich echt die Kriese!
Jetzt habe ich auch die Zeile:
Delphi-Quelltext 1:
| HTTP.Protocol := Quelle.Sock_Protocol; |
auskommentiert. Nun knallt es aber an folgender Stelle:
Delphi-Quelltext 1: 2: 3:
| if HTTP.HTTPMethod('GET', URI) then |
ich weiß echt nicht mehr was ich noch versuchen kann. Die Adressen die bei der Zugriffsverletzung angezeigt werden, sind immer die Selben. Ein paar Zeilen über dem Haltepunkt im ASM-Code, steht der Funktionsname LoadResString.
Ich hoffe nur das mir jemand helfen kann, da ich sonst noch ausm Fenster springe.
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 10.12.07 12:38
An irgend einer Stelle wird dein HTTP Objekt überschrieben. Das ist eigentlich die einzige Möglichkeit wie soetwas passieren kann.
Lauf nochmal im Einzelschritt durch und gehe mit der Maus mach jeder Zeile über den "HTTP" Text. Dann wird dir, falls vorhanden, der Inhalt der Klasse angezeigt. Oder eine Zugriffsverletzung wenn die Instanz ungültig ist.
Das ganze läuft ja in einem Thread, Bist du dir sicher dass das Objekt nicht irgendwo anders noch beschrieben wird, wo es eventuell tot gemacht werden kann?
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mo 10.12.07 12:40
Ich bin mir ganz sicher, da es nur im Thread-Objekt bekannt ist.
Wenn ich mit dem Haltepunkt durchgehe und mir die Auswertung in der Zeile zuvor anschaue, dann ist alles in Ordnung. Aber sobald ich entweder F7 oder F8 drücke, knallt es direkt.
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 10.12.07 13:08
Gut, dann wäre als nächste Möglichkeit via STRG+F7 dir von HTTP.UserAgent in die Liste der überwachten Ausdrücke aufzunehmen, dir die Liste irgendwo hin packen wo du sie im Auge behalten kannst und dann wieder im Einzelschritt durchlaufen, ob da irgendwann nix vernünftiges mehr angezeigt wird.
Aber nach allem was ich jetzt gelesen habe, bin ich mir eigentlich recht sicher, das an irgend einer anderen Stelle das Objekt oder der ganze Thread gekillt wird solange er noch läuft.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mo 10.12.07 13:26
Habe es so gemacht wie du es geschrieben hast, allerdings hilft das nicht wirklich.
Wenn ich an der Stelle bin wo Keep-Alive in die Header-StringList geschrieben wird, existiert das Objekt noch, aber sobald ich weiter gehe, steht da: "Prozess nicht verfügbar".
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 10.12.07 14:23
Das ist doch genau das, was ich wissen wollte.
Wenn du die Zeilen
Delphi-Quelltext 1: 2:
| if HTTP.KeepAlive then HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive)); |
auskommentierst knallt es später?
und wenn du die
HTTP.KeepAlive := Quelle.Sock_KeepAlive > 0;
auch auskommentierst?
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mo 10.12.07 14:30
Wenn ich die Zeilen:
Delphi-Quelltext 1: 2:
| if HTTP.KeepAlive then HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive)); |
auskommentiere, knallt es an späterer Stelle:
Delphi-Quelltext 1:
| HTTP.Protocol := Quelle.Sock_Protocol; |
(Hatte ich aber schon vorher mal gepostet!)
Wenn ich folgendes auskommentiere, knallt es auch an der Stelle "HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive));".
Delphi-Quelltext 1:
| HTTP.KeepAlive := Quelle.Sock_KeepAlive > 0; |
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 10.12.07 17:30
Ich weis das du das schonmal hattest.
Ich bin nach wie vor der Meinung das du in einem anderen Thread irgendetwas machst was den Thread oder zumindest das HTTP Objekt schlachtet.
Das ist aber eben erst möglich wenn der andere Thread zum Zuge gekommen ist.
Da der Delphi Debugger alle anderen Threads einfriert wenn du einem der Threads drinne stehst und im Einzelschritt durchläufst. Die anderen Threads kommen erst ein Stückchen weiter wenn Delphi mal nicht die volle Kontrolle hat. Wie Beispielsweise bei beim Aufruf von Methoden oder dem setzen von Propertys die intern Methoden zur Verarbeitung aufrufen.
Was macht eigentlich der UserAgent? Besser, was ist das?
Kommentiere den mal aus.
Jaja ich weis, das ist stochern im Trüben, aber hier ist es wenigstens so dass das Trübe verschwindet je länger man stochert.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mo 10.12.07 17:40
Deine Vermutung das ein anderer Thread da was kaputt macht, kann nicht sein. Denn ich habe aus Test-Zwecken nur einen Thread laufen.
Ich habe auch bereits eigentlich alles auskommentiert, bis auf die Zeile mit "HTTPMethod(..)". Und dort bin ich dann rein gegangen und dort wurde nur eine Stringvariable gesetzt und es hat geknallt: "Prot := 'http';".
Deswegen bin ich mit meinem Latein am ende und hoffe, dass man mir helfen kann.
Gruß
Mordi
PS: Habe auch schon mit MemCheck compiliert, aber das hat auch nichts zu Tage gebracht.
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 10.12.07 20:33
Dann komme ich nicht weiter ohne die ganze Klasse zu sehen. Wenn du sie nicht veröffentlichen willst kannst du sie mir auch via PN schicken.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mo 10.12.07 22:16
Ok, dann poste ich mal die Unit mit dem Thread und die vom Hauptformular.
Hauptformular:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92:
| unit FrmMain;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ToolWin, ComCtrls, Menus, StdCtrls, QuellThread, BaseQuelle;
{$DEFINE debug}
type TMainFrm = class(TForm) MainMenu1: TMainMenu; Datei1: TMenuItem; StatusBar1: TStatusBar; ToolBar1: TToolBar; Button1: TButton; Edit1: TEdit; RichEdit1: TRichEdit; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private QuellenThreads: TQuellenThreads; procedure DoFoundOverview(Sender: TObject; Overview: TOverview); public end;
var MainFrm: TMainFrm;
implementation
{$R *.DFM}
procedure TMainFrm.Button1Click(Sender: TObject); begin if Length(QuellenThreads) = 0 then SetLength(QuellenThreads, 1);
RichEdit1.Lines.Clear;
if Assigned(QuellenThreads[0]) then QuellenThreads[0].Terminate; QuellenThreads[0] := TQuellThread.Create(True); try QuellenThreads[0].TestURI := Edit1.Text; QuellenThreads[0].DllName := 'xxxxx.dll'; QuellenThreads[0].OnFoundOverview := DoFoundOverview;
QuellenThreads[0].Resume; except end; end;
procedure TMainFrm.FormDestroy(Sender: TObject); const ciWait = 60000; var i, StartTick, Tick: Integer; begin try for i := 0 to High(QuellenThreads) do begin StartTick := GetTickCount; while not QuellenThreads[i].Terminated do begin Application.ProcessMessages; Tick := GetTickCount; if (Tick - StartTick) >= ciWait then QuellenThreads[i].Terminate; end; end; QuellenThreads := nil; finally end; end;
procedure TMainFrm.DoFoundOverview(Sender: TObject; Overview: TOverview); begin if not Overview.Empty then RichEdit1.Lines.Add(Overview.MarkeModellZusatz); end;
end. |
Thread-Unit:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275:
| unit QuellThread;
interface
uses Classes, SysUtils, Windows, Dialogs, SyncObjs, httpsend, BaseQuelle;
type TDLL_ObjectGet = function: TBaseQuelle; stdcall; TDllStrFunc = function(P: PChar): Integer of object;
TFoundOverview = procedure(Sender: TObject; Overview: TOverview) of object;
TQuellThread = class(TThread) private FCriticalSection: TCriticalSection; FTestURI: string; FDllName: string; FFoundOverview: TFoundOverview;
function GetDllStr(Func: TDllStrFunc): string; function GetHTTP(Quelle: TBaseQuelle; URI: string): string;
function LoadDLL: Boolean; procedure FreeDLL; protected HTTP: THTTPSend; HandleDLL: THandle; DLL_ObjectGet: TDLL_ObjectGet;
procedure Execute; override; public constructor Create(CreateSuspended: Boolean); destructor Destroy; override; property Terminated; published property TestURI: string read FTestURI write FTestURI; property DllName: string read FDllName write FDllName; property OnFoundOverview: TFoundOverview read FFoundOverview write FFoundOverview; end; TQuellenThreads = array of TQuellThread;
implementation
constructor TQuellThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended);
HTTP := THTTPSend.Create; end;
destructor TQuellThread.Destroy; begin if Assigned(HTTP) then HTTP.Free;
inherited; end;
function TQuellThread.GetDllStr(Func: TDllStrFunc): string; var iLen: Integer; P: PChar; begin Result := ''; iLen := Func(nil); if iLen = 0 then Exit;
GetMem(P, iLen); try Func(P); Result := Trim(string(P)); finally FreeMem(P, iLen); end; end;
function TQuellThread.GetHTTP(Quelle: TBaseQuelle; URI: string): string; var slTmp: TStrings; begin Result := ''; try HTTP.Clear; HTTP.Timeout := Quelle.Sock_Timeout; HTTP.UserAgent := Quelle.Sock_UserAgent; if Length(Quelle.Sock_Referer) > 0 then HTTP.Headers.Add('Referer: ' + Quelle.Sock_Referer); HTTP.KeepAlive := Quelle.Sock_KeepAlive > 0; if HTTP.KeepAlive then HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive)); HTTP.Protocol := Quelle.Sock_Protocol;
slTmp := TStringList.Create; try if HTTP.HTTPMethod('GET', URI) then begin slTmp.LoadFromStream(HTTP.Document); Result := slTmp.Text; end; finally slTmp.Free; end; except on E:Exception do begin if Assigned(Quelle.LogFile) then Quelle.LogFile.WriteError('/// EXCEPTION: ' + E.Message); end; end; end;
procedure TQuellThread.FreeDLL; var arBuff: array[0..511] of Char; begin if HandleDLL <> 0 then begin DLL_ObjectGet := nil;
if not FreeLibrary(HandleDLL) then begin FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError(), 0, arBuff, SizeOf(arBuff), nil); MessageDlg(arBuff, mtError, [mbOK], 0); end; end; end;
function TQuellThread.LoadDLL: Boolean; begin Result := False; HandleDLL := LoadLibrary(PChar(DllName)); if HandleDLL <> 0 then begin @DLL_ObjectGet := GetProcAddress(HandleDLL, 'ext_ObjectGet');
Result := Assigned(DLL_ObjectGet);
if not Result then FreeDLL; end; end;
procedure TQuellThread.Execute; var Quelle: TBaseQuelle; Overview: TOverview; sTmp, sURI, sURI_Befor, sURI_After, sURI_CookiePage, sBefor, sAfter: string;
procedure DoBefor(BI: TBeforIndex); begin sBefor := ''; Quelle.BeforIndex := BI; sURI_Befor := GetDllStr(Quelle.Befor); if Length(sURI_Befor) > 0 then sBefor := GetHTTP(Quelle, sURI_Befor); Quelle.DoBefor(PChar(sBefor)); end;
procedure DoAfter(AI: TAfterIndex); begin sAfter := ''; Quelle.AfterIndex := AI; sURI_After := GetDllStr(Quelle.After); if Length(sURI_After) > 0 then sAfter := GetHTTP(Quelle, sURI_After); Quelle.DoAfter(PChar(sAfter)); end;
begin if not LoadDLL then begin Terminate; Exit; end; try Quelle := DLL_ObjectGet; try if Assigned(Quelle) then try sURI_CookiePage := GetDllStr(Quelle.CookiePageURI); if Length(sURI_CookiePage) > 0 then begin sTmp := GetHTTP(Quelle, sURI_CookiePage); end; sURI := FTestURI; DoBefor(biAll); repeat sTmp := GetHTTP(Quelle, sURI);
DoBefor(biOverview); FCriticalSection := TCriticalSection.Create; try Overview := Quelle.FirstOverview(PChar(sTmp)); while not Overview.Empty do begin if Assigned(FFoundOverview) then begin FCriticalSection.Enter; FFoundOverview(Self, Overview); FCriticalSection.Leave; end;
FillChar(Overview, SizeOf(TOverview), #0); Overview := Quelle.NextOverview; end; finally FCriticalSection.Free; end;
DoAfter(aiOverview); sURI := GetDllStr(Quelle.NextPageURI); until Length(sURI) = 0;
DoAfter(aiAll); except on E:Exception do begin if Assigned(Quelle.LogFile) then Quelle.LogFile.WriteError('/// EXCEPTION: ' + E.Message); end; end; finally if Assigned(Quelle) then Quelle.Free; end; finally FreeDLL; Terminate; end; end;
end. |
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Di 11.12.07 12:03
Mordilion hat folgendes geschrieben: |
Die geneu Zeile wo es knallt kann ich leider nicht sagen, aber wenn ich eine andere Kompo verwende geht es.
|
Was meinst du damit, wenn du eine andere Komponente verwendest?
Die Methode mit der du auf deine geheimnissvolle DLL zugreifst ist recht interessant. Schaut aus wie eine Plugintechnik.
Bist du dir sicher das du die Dll richtig intialisiert hast und dein Zugriffsobjekt passt?
Wenn die DLL nicht in Delphi geschrieben wurde musst du auf jeden Fall alle Prozedur- und Funktionsaufrufe mit der Aufrufkonvention cdecl deklarieren.
Ansonsten, warum verwendest du keine andere Komponente, wenn es mit der ging?
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Di 11.12.07 12:46
Ich bin mir eigentlich SEHR sicher, dass das alles soweit richtig ist, da ich die DLL selber geschrieben habe.
Eine andere Kompo würde ich ungerne verwenden, da sich Synapse für meine Aufgaben eigentlich sehr gut eignet.
Aber wenn mir nichts anderes übrig bleibt, muss ich wohl eine andere Kompo nehmen. Welche Alternative ist denn Thread-Sicher? Ich weiß von Indy, dass die nicht Thread-Sicher sind.
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Mi 12.12.07 11:05
So, ich habe mir das alles nochmal angeschaut und wenn ich nun anstatt der Synapse-Lib die ICS "Internet Component Suite" verwende, klappt alles. Nur der Nachteil ist, dass ich z.B: bei ICS nicht die Möglichkeit habe den Header zu manipulieren. Was aber für meine Zwecke sehr wichtig ist.
Gibt es vielleicht etwas vergleichbares wie die Synapse-Lib das Thread-Sicher ist und nicht auf basis von TComponent programmiert ist?
[edit]
Habe nun herausgefunden, dass ich einfach nur eine Instanz von der ICS-Komponente im Thread benötige. Denn dann läuft es auch mit der Synapse-Lib. Die große Frage WIESO, kann ich leider nicht beantworten. Aber vielleicht kennt ja jemand die Antwort auf diese Frage.
[/edit]
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 12.12.07 17:23
Hast Du dir mal die Demos zu Synapse angeschaut? Vieleicht muss da noch irgendwas initialisiert werden.
Beim durchsehen der Unit httpsend.pas habe ich jedenfalls keinen Hinweis gefunden.
(An den Demos ist auch nicht viel dran)
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Mordilion 
      
Beiträge: 96
WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
|
Verfasst: Do 09.10.08 07:58
Habe mittlerweile den Fehler gefunden und ich muss sagen, dass es nichts mit der SynapseLib zu tun hat.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function TQuellThread.GetDllStr(Func: TDllStrFunc): string; var iLen: Integer; P: PChar; begin Result := ''; iLen := Func(nil); if iLen = 0 then Exit;
GetMem(P, iLen + 1); try Func(P); Result := Trim(string(P)); finally FreeMem(P); end; end; |
Vielleicht hilft die Info ja mal einem anderen weiter.
Gruß
Mordi
_________________ Für das große Chaos haben wir Computer. Die übrigen Fehler machen wir von Hand.
Der Mensch ist das wichtigste und kostbarste Peripheriegerät einer Computeranlage.
|
|
|