Autor Beitrag
Mordilion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: So 09.12.07 19:38 
Habe ich gemacht und es ist folgende Zeile:

ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: Mo 10.12.07 12:19 
Also so langsam bekomme ich echt die Kriese!

Jetzt habe ich auch die Zeile:

ausblenden Delphi-Quelltext
1:
  HTTP.Protocol := Quelle.Sock_Protocol;					


auskommentiert. Nun knallt es aber an folgender Stelle:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 10.12.07 14:23 
Das ist doch genau das, was ich wissen wollte.
Wenn du die Zeilen
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: Mo 10.12.07 14:30 
Wenn ich die Zeilen:
ausblenden Delphi-Quelltext
1:
2:
  if HTTP.KeepAlive then
    HTTP.Headers.Add('Keep-Alive: ' + IntToStr(Quelle.Sock_KeepAlive));


auskommentiere, knallt es an späterer Stelle:
ausblenden 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));".
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: Mo 10.12.07 22:16 
Ok, dann poste ich mal die Unit mit dem Thread und die vom Hauptformular.

Hauptformular:
ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
    QuellenThreads: TQuellenThreads;
    procedure DoFoundOverview(Sender: TObject; Overview: TOverview);
  public
    { Public-Deklarationen }
  end;

var
  MainFrm: TMainFrm;

implementation

{$R *.DFM}


{ TMainFrm }

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// 60000 millisekunden = 1 Minute
var
  i, StartTick, Tick: Integer;
begin
  // Warten bis alle Threads beendet sind!
  try
    for i := 0 to High(QuellenThreads) do
    begin
      StartTick := GetTickCount;
      while not QuellenThreads[i].Terminated do
      begin // Wenn es länger dauert als ciWait, wir der Thread gekillt!
        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:
ausblenden volle Höhe 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:
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
  // *** DLL Types
  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

{ TQuellThread }

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;
//    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;
  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..511of 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
        // *********************************************************************
        // *** CookiePageURI * Darf nur am Anfang der Suche aufgerufen werden
        sURI_CookiePage := GetDllStr(Quelle.CookiePageURI);
        if Length(sURI_CookiePage) > 0 then
        begin
          sTmp := GetHTTP(Quelle, sURI_CookiePage);
//          Quelle.Sock_Cookies := HTTP.Cookies;
        end;
        // *********************************************************************

        // URI ZUR ERSTEN ÜBERSICHTSSEITE ** TODO **
        sURI := FTestURI; // ONLY 4 TESTING

        // *********************************************************************

        // *** Befor ALL
        DoBefor(biAll);
        // *********************************************************************

        repeat
          // LADEN DER ÜBERSICHTSSEITE ** TODO **
          sTmp := GetHTTP(Quelle, sURI);

          // *******************************************************************
          // *** Befor Overview
          DoBefor(biOverview);
          // *******************************************************************

          FCriticalSection := TCriticalSection.Create;
          try
            Overview := Quelle.FirstOverview(PChar(sTmp));
            while not Overview.Empty do
            begin
              // ONLY 4 TESTING
              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;

          // *******************************************************************
          // *** After Overview
          DoAfter(aiOverview);
          // *******************************************************************

          sURI := GetDllStr(Quelle.NextPageURI);
        until
          Length(sURI) = 0;

        // *********************************************************************
        // *** After ALL
        DoAfter(aiAll);
        // *********************************************************************
      except
        // ToDo: Handle Exception
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 11.12.07 12:03 
user profile iconMordilion 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP Prof., Win2k Prof.
Delphi 7 Prof., Delphi 2009 Prof., PHP4/5, CSS, HTML
BeitragVerfasst: Do 09.10.08 07:58 
Habe mittlerweile den Fehler gefunden und ich muss sagen, dass es nichts mit der SynapseLib zu tun hat. :)

ausblenden 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;

// ** Fehlerhafte Variante
//  GetMem(P, iLen);

// ** So klappt es nun
  GetMem(P, iLen + 1); // Vermutlich +1 wegen der NULL-Terminierung des PChar

  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.