OSDN Git Service

・TBoardPlugIns に AcceptURL, CreateThreadItem, DisposeThreadItem を追加。
[gikonavigoeson/gikonavi.git] / ExternalBoardManager.pas
1 unit ExternalBoardManager;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdHTTP, IdComponent, IdGlobal, IdException,
8         AbonUnit;
9
10 type
11         // TThreadItem \82Ì\83v\83\8d\83p\83e\83B\90Ý\92è\81^\8eæ\93¾ ID
12         TThreadItemProperty = (
13                 tipContext,                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
14                 tipNo,                                                                  // : Integer            // \94Ô\8d\86
15                 tipFileName,                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
16                 tipTitle,                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
17                 tipRoundDate,                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
18                 tipLastModified,                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
19                 tipCount,                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
20                 tipAllResCount,                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
21                 tipNewResCount,                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
22                 tipSize,                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
23                 tipRound,                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
24                 tipRoundName,                                           // : string                     // \8f\84\89ñ\96¼
25                 tipIsLogFile,                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
26                 tipKokomade,                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
27                 tipNewReceive,                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
28                 tipNewArrival,                                  // : Boolean            // \90V\92\85
29                 tipUnRead,                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
30                 tipScrollTop,                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
31                 tipDownloadHost,                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
32                 tipAgeSage,                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
33                 tipURL,                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
34         tipFilePath                                                     // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
35         );
36
37         // *************************************************************************
38         // \83v\83\89\83O\83C\83\93\82Ì\83o\81[\83W\83\87\83\93
39         // *************************************************************************
40         TOnVersionInfo = procedure(
41                 var outAgent            : PChar;        // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
42                 var outMajor            : DWORD;        // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
43                 var outMinor            : DWORD;        // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
44                 var outRelease  : PChar;        // \83\8a\83\8a\81[\83X\92i\8aK\96¼
45                 var outRevision : DWORD         // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
46         ); stdcall;
47
48   // *************************************************************************
49   // \8ew\92è\82µ\82½ URL \82ð\82±\82Ì\83v\83\89\83O\83C\83\93\82Å\8eó\82¯\95t\82¯\82é\82©\82Ç\82¤\82©
50   // *************************************************************************
51   TOnAcceptURL = function(
52         inURL : PChar                                           // \94»\92f\82ð\8bÂ\82¢\82Å\82¢\82é URL
53   ): Boolean; stdcall;                  // \8eó\82¯\95t\82¯\82é\82È\82ç True
54
55   // *************************************************************************
56   // TThreadItem \82ª\90\90¬\82³\82ê\82½
57   // *************************************************************************
58   TThreadItemCreate = procedure(
59         inInstance : DWORD
60   ); stdcall;
61
62   // *************************************************************************
63   // TThreadItem \82ª\94j\8aü\82³\82ê\82½
64   // *************************************************************************
65   TThreadItemDispose = procedure(
66         inInstance : DWORD
67   ); stdcall;
68
69
70
71         // =========================================================================
72         // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
73         // =========================================================================
74         TBoardPlugIn = class( TObject )
75         private
76                 FFilePath                                               : string;               // \83v\83\89\83O\83C\83\93\82ð\8e¦\82·\83p\83X
77                 FModule                                                 : HMODULE;      // \83v\83\89\83O\83C\83\93\82Ì\83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b
78
79                 FVersionInfo                            : TOnVersionInfo;
80         FAcceptURL                                      : TOnAcceptURL;
81         FCreateThreadItem               : TThreadItemCreate;
82         FDisposeThreadItem      : TThreadItemDispose;
83
84         public
85                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
86                 constructor     CreateFromPath( inPath : string );
87                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
88                 constructor     CreateFromName( inName : string );
89                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
90                 constructor     CreateFromModule( inModule : HMODULE );
91
92                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
93                 procedure       LoadFromPath( inPath : string );
94                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
95                 procedure       LoadFromName( inName : string );
96                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
97                 procedure       LoadFromModule( inModule : HMODULE );
98                 // \83o\81[\83W\83\87\83\93\8fî\95ñ
99                 procedure       VersionInfo(    var outAgent : string;
100                         var outMajor : DWORD; var outMinor : DWORD;
101                         var outRelease : string; var outRevision : DWORD );
102                 // \8ew\92è\82µ\82½ URL \82ð\82±\82Ì\83v\83\89\83O\83C\83\93\82Å\8eó\82¯\95t\82¯\82é\82©\82Ç\82¤\82©
103         function        AcceptURL( inURL : string ) : Boolean;
104         procedure       CreateThreadItem( threadItem : DWORD );
105         procedure       DisposeThreadItem( threadItem : DWORD );
106
107         private
108                 procedure       LoadPlugInAPI;
109
110         public
111                 property        FilePath        : string        read FFilePath;
112                 property        Module          : HMODULE       read FModule;
113         end;
114
115 var
116         OnWork                          : TWorkEvent;
117         OnWorkBegin             : TWorkBeginEvent;
118         OnWorkEnd                       : TWorkEndEvent;
119
120         BoardPlugIns    : array of TBoardPlugIn;
121
122 procedure InitializeBoardPlugIns;
123
124 function CreateResultString(
125         resultStr : string
126 ) : PChar; stdcall;
127
128 function ThreadItemDat2HTML(
129         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
130         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
131         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
132         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
133 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
134
135 procedure DisposeResultString(
136         resultStr : PChar
137 ); stdcall;
138
139 implementation
140
141 uses GikoSystem, BoardGroup;
142
143 // =========================================================================
144 // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
145 // =========================================================================
146
147 // *************************************************************************
148 // BoardPlugin \83t\83H\83\8b\83_\82É\82 \82é\83v\83\89\83O\83C\83\93\82ð\91S\82Ä\83\8d\81[\83h
149 // *************************************************************************
150 procedure InitializeBoardPlugIns;
151 var
152         i, bound                : Integer;
153   pluginNames   : TStringList;
154 begin
155
156         pluginNames := TStringList.Create;
157   try
158         GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False );
159         SetLength( BoardPlugIns, pluginNames.Count );
160
161         bound := pluginNames.Count - 1;
162         for i := 0 to bound do
163                 BoardPlugIns[ i ] := TBoardPlugIn.CreateFromName( pluginNames.Strings[ i ] );
164   finally
165         pluginNames.Free;
166   end;
167
168 end;
169
170
171
172 // =========================================================================
173 // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
174 // =========================================================================
175
176 // *************************************************************************
177 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
178 // *************************************************************************
179 constructor     TBoardPlugIn.CreateFromPath(
180         inPath : string
181 );
182 begin
183
184         inherited Create;
185
186         LoadFromPath( inPath );
187
188 end;
189
190 // *************************************************************************
191 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
192 // *************************************************************************
193 constructor     TBoardPlugIn.CreateFromName(
194         inName : string
195 );
196 begin
197
198         inherited Create;
199
200         LoadFromName( inName );
201
202 end;
203
204 // *************************************************************************
205 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
206 // *************************************************************************
207 constructor     TBoardPlugIn.CreateFromModule(
208         inModule : HMODULE
209 );
210 begin
211
212         inherited Create;
213
214         LoadFromModule( inModule );
215
216 end;
217
218 // *************************************************************************
219 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
220 // *************************************************************************
221 procedure TBoardPlugIn.LoadFromPath(
222         inPath : string
223 );
224 begin
225
226         FFilePath := inPath;
227   if FileExists( inPath ) then
228                 FModule := LoadLibrary( PChar( inPath ) )
229   else if FileExists( inPath + '.dll' ) then
230                 FModule := LoadLibrary( PChar( inPath + '.dll' ) );
231
232         LoadPlugInAPI;
233
234 end;
235
236 // *************************************************************************
237 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
238 // *************************************************************************
239 procedure TBoardPlugIn.LoadFromName(
240         inName : string
241 );
242 begin
243
244         LoadFromPath( GikoSys.Setting.GetBoardPlugInDir + inName );
245
246 end;
247
248 // *************************************************************************
249 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
250 // *************************************************************************
251 procedure TBoardPlugIn.LoadFromModule(
252         inModule        : HMODULE
253 );
254 var
255         tmp                             : array [0..MAX_PATH] of Char;
256 begin
257
258         GetModuleFileName( inModule, tmp, SizeOf( tmp ) );
259         FFilePath       := tmp;
260         FModule         := inModule;
261
262         LoadPlugInAPI;
263
264 end;
265
266 // *************************************************************************
267 // \83o\81[\83W\83\87\83\93\8fî\95ñ
268 // *************************************************************************
269 procedure TBoardPlugIn.VersionInfo(
270         var outAgent            : string;               // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
271         var outMajor            : DWORD;                // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
272         var outMinor            : DWORD;                // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
273         var outRelease  : string;               // \83\8a\83\8a\81[\83X\92i\8aK\96¼
274         var outRevision : DWORD                 // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
275 );
276 var
277         agent                                           : PChar;
278         release                                 : PChar;
279 begin
280
281         if Assigned( FVersionInfo ) then begin
282                 FVersionInfo( agent, outMajor, outMinor, release, outRevision );
283                 outAgent                := string( agent );
284                 outRelease      := string( release );
285                 DisposeResultString( agent );
286                 DisposeResultString( release );
287         end;
288
289 end;
290
291 // *************************************************************************
292 // \8ew\92è\82µ\82½ URL \82ð\82±\82Ì\83v\83\89\83O\83C\83\93\82Å\8eó\82¯\95t\82¯\82é\82©\82Ç\82¤\82©
293 // *************************************************************************
294 function        TBoardPlugIn.AcceptURL(
295         inURL : string
296 ) : Boolean;
297 begin
298
299         if Assigned( FAcceptURL ) then
300         Result := FAcceptURL( PChar( inURL ) )
301   else
302         Result := False;
303
304 end;
305
306 // *************************************************************************
307 // TThreadItem \82ª\90\90¬\82³\82ê\82½
308 // *************************************************************************
309 procedure       TBoardPlugIn.CreateThreadItem(
310         threadItem : DWORD
311 );
312 begin
313
314         if Assigned( FCreateThreadItem ) then
315         FCreateThreadItem( threadItem );
316
317 end;
318
319 // *************************************************************************
320 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
321 // *************************************************************************
322 procedure       TBoardPlugIn.DisposeThreadItem(
323         threadItem : DWORD
324 );
325 begin
326
327         if Assigned( FDisposeThreadItem ) then
328         FDisposeThreadItem( threadItem );
329
330 end;
331
332 // *************************************************************************
333 // \83v\83\89\83O\83C\83\93\82Ì API \82ð\8eæ\93¾
334 // *************************************************************************
335 procedure TBoardPlugIn.LoadPlugInAPI;
336 begin
337
338         try
339                 if Assigned( Pointer( FModule ) ) then begin
340                         FVersionInfo                            := GetProcAddress( FModule, 'OnVersionInfo' );
341                         FAcceptURL                                      := GetProcAddress( FModule, 'OnAcceptURL' );
342                         FCreateThreadItem               := GetProcAddress( FModule, 'ThreadItemCreate' );
343                         FDisposeThreadItem      := GetProcAddress( FModule, 'ThreadItemDispose' );
344                 end;
345         except
346         end;
347
348 end;
349
350
351
352 // =========================================================================
353 // PlugInMain
354 // =========================================================================
355
356 // *************************************************************************
357 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8am\95Û\82·\82é
358 // *************************************************************************
359 function CreateResultString(
360         resultStr : string
361 ) : PChar; stdcall;
362 var
363         tmp : PChar;
364 begin
365
366         tmp := PChar( resultStr );
367         GetMem( Result, Length( tmp ) + 1 );
368         Move( tmp^, Result^, Length( tmp ) + 1 );
369
370 end;
371
372 // *************************************************************************
373 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8aJ\95ú\82·\82é
374 // *************************************************************************
375 procedure DisposeResultString(
376         resultStr : PChar
377 ); stdcall;
378 begin
379
380         FreeMem( resultStr );
381
382 end;
383
384 // *************************************************************************
385 // \83v\83\8d\83O\83\89\83\80\96{\91Ì\82Ì\83o\81[\83W\83\87\83\93\82ð\8eæ\93¾\82·\82é
386 // *************************************************************************
387 procedure VersionInfo(
388         var outAgent            : PChar;        // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
389         var outMajor            : DWORD;        // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
390         var outMinor            : DWORD;        // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
391         var outRelease  : PChar;        // \83\8a\83\8a\81[\83X\92i\8aK\96¼
392         var outRevision : DWORD         // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
393 ); stdcall;
394 begin
395
396         outAgent                := CreateResultString( PChar( APP_NAME ) );
397         outMajor                := 1;
398         outMinor                := 0;
399         outRelease      := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
400         outRevision     := BETA_VERSION;
401
402 end;
403
404 // *************************************************************************
405 // \8ew\92è\82µ\82½ URL \82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\95Ô\82·
406 // *************************************************************************
407 function InternalDownload(
408         inURL                                                   : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82·\82é URL
409         var ioModified          : Double;       // \8dÅ\8cã\82É\8eæ\93¾\82µ\82½\93ú\8e\9e
410         var outResultData       : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82³\82ê\82½\95\8e\9a\97ñ
411         inRangeStart                    : DWORD;        // \8aJ\8en\88Ê\92u
412         inRangeEnd                              : DWORD         // \8fI\97¹\88Ê\92u
413 ) : Longint; stdcall;                                   // \83\8c\83X\83|\83\93\83X\83R\81[\83h
414 var
415         httpSocket                              : TIdHTTP;
416         resStream                                       : TMemoryStream;
417         content                                         : string;
418 begin
419
420         Result := -1;
421
422         httpSocket := TIdHTTP.Create( nil );
423         try
424                 // \83C\83x\83\93\83g\82Ì\90Ý\92è
425                 if Assigned( OnWork ) then
426                         httpSocket.OnWork                               := OnWork;
427                 if Assigned( OnWorkBegin ) then
428                         httpSocket.OnWorkBegin  := OnWorkBegin;
429                 if Assigned( OnWorkEnd ) then
430                         httpSocket.OnWorkEnd            := OnWorkEnd;
431
432         // \92Ê\90M\82É\8aÖ\82·\82é\90Ý\92è
433                 httpSocket.Request.CustomHeaders.Clear;
434                 httpSocket.Response.Clear;
435                 httpSocket.Request.Clear;
436
437                 httpSocket.Request.UserAgent    := GikoSys.GetUserAgent;
438                 httpSocket.RecvBufferSize                       := Gikosys.Setting.RecvBufferSize;
439                 httpSocket.ProxyParams.BasicAuthentication := False;
440                 {$IFDEF DEBUG}
441                 Writeln('------------------------------------------------------------');
442                 {$ENDIF}
443                 //httpSocket.AllowCookies := False;
444                 if GikoSys.Setting.ReadProxy then begin
445                         if GikoSys.Setting.ProxyProtocol then
446                                 httpSocket.ProtocolVersion := pv1_1
447                         else
448                                 httpSocket.ProtocolVersion := pv1_0;
449                         httpSocket.ProxyParams.ProxyServer              := GikoSys.Setting.ReadProxyAddress;
450                         httpSocket.ProxyParams.ProxyPort                        := GikoSys.Setting.ReadProxyPort;
451                         httpSocket.ProxyParams.ProxyUsername    := GikoSys.Setting.ReadProxyUserID;
452                         httpSocket.ProxyParams.ProxyPassword    := GikoSys.Setting.ReadProxyPassword;
453                         if GikoSys.Setting.ReadProxyUserID <> '' then
454                                 httpSocket.ProxyParams.BasicAuthentication := True;
455                         {$IFDEF DEBUG}
456                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82 \82è');
457                         Writeln('\83z\83X\83g: ' + GikoSys.Setting.ReadProxyAddress);
458                         Writeln('\83|\81[\83g: ' + IntToStr( GikoSys.Setting.ReadProxyPort ));
459                         {$ENDIF}
460                 end else begin
461                         if GikoSys.Setting.Protocol then
462                                 httpSocket.ProtocolVersion := pv1_1
463                         else
464                                 httpSocket.ProtocolVersion := pv1_0;
465                         httpSocket.ProxyParams.ProxyServer              := '';
466                         httpSocket.ProxyParams.ProxyPort                        := 80;
467                         httpSocket.ProxyParams.ProxyUsername    := '';
468                         httpSocket.ProxyParams.ProxyPassword    := '';
469                         {$IFDEF DEBUG}
470                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82È\82µ');
471                         {$ENDIF}
472                 end;
473
474                 httpSocket.Request.ContentRangeStart    := inRangeStart;
475                 httpSocket.Request.ContentRangeEnd              := inRangeEnd;
476                 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
477                         httpSocket.Request.LastModified := ioModified - OffsetFromUTC;
478                 if inRangeStart = 0 then
479                         httpSocket.Request.AcceptEncoding := 'gzip'
480                 else
481                         httpSocket.Request.AcceptEncoding := '';
482                 httpSocket.Request.Accept := 'text/html';
483
484                 resStream := TMemoryStream.Create;
485                 try
486                         try
487                                 resStream.Clear;
488
489                                 {$IFDEF DEBUG}
490                                 Writeln('URL: ' + inURL);
491                                 {$ENDIF}
492                                 httpSocket.Get( inURL, resStream );
493                                 {$IFDEF DEBUG}
494                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
495                                 {$ENDIF}
496
497                                 content                 := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
498                                 ioModified      := httpSocket.Response.LastModified;
499
500                                 Result := httpSocket.ResponseCode;
501                                 if (Length( content ) = 0) and (Result = 206) then
502                                         Result := 304;
503
504                                 outResultData := CreateResultString( content );
505                         except
506                                 on E: EIdSocketError do begin
507                                         ioModified              := ZERO_DATE;
508                                         outResultData   := nil;
509                                 end;
510                                 on E: EIdConnectException do begin
511                                         ioModified              := ZERO_DATE;
512                                         outResultData   := nil;
513                                         //Item.ErrText  := E.Message;
514                                 end;
515                                 on E: Exception do begin
516                                         {$IFDEF DEBUG}
517                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
518                                         Writeln('E.Message: ' + E.Message);
519                                         {$ENDIF}
520                                         ioModified              := ZERO_DATE;
521                                         outResultData   := nil;
522                                         Result                          := httpSocket.ResponseCode;
523                                         //Item.ErrText  := E.Message;
524                                 end;
525                         end;
526                 finally
527                         resStream.Free;
528                 end;
529
530         finally
531                 httpSocket.Free;
532         end;
533
534 end;
535
536 // *************************************************************************
537 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e®\82ð\83\8d\81[\83J\83\8b\82 \82Ú\81`\82ñ\82É\92Ê\82·
538 // *************************************************************************
539 function InternalAbon(
540         inDatText : PChar                               // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<>[\89ü\8ds] \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
541 ) : PChar; stdcall;                             // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
542 var
543         datList : TStringList;
544 begin
545
546         datList := TStringList.Create;
547         datList.Text := string( inDatText );
548         //GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
549         GikoSys.FAbon.Execute( datList );
550         GikoSys.FSelectResFilter.Execute( datList );
551
552         Result := CreateResultString( datList.Text );
553
554 end;
555
556 // *************************************************************************
557 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
558 // *************************************************************************
559 function InternalDat2HTML(
560         inDatRes        : PChar;                        // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
561         inResNo         : DWORD;                        // \83\8c\83X\94Ô\8d\86
562         inIsNew         : Boolean                       // \90V\92\85\83\8c\83X\82È\82ç True
563 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
564 var
565         board : TBoard;
566         threadItem : TThreadItem;
567 begin
568
569         // \83_\83~\81[\82Ì\83N\83\89\83X
570         board                           := TBoard.Create;
571         threadItem      := TThreadItem.Create;
572
573         try
574                 threadItem.ParentBoard := Board;
575
576                 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
577         except
578                 Result := nil;
579         end;
580
581 end;
582
583
584
585 // =========================================================================
586 // FilePath
587 // =========================================================================
588
589 // *************************************************************************
590 // \83u\83\89\83E\83U\96{\91Ì\82ª\92u\82¢\82Ä\82 \82é\83t\83H\83\8b\83_
591 // *************************************************************************
592 function ApplicationFolder : PChar; stdcall;
593 begin
594
595         Result := CreateResultString( GikoSys.GetAppDir );
596
597 end;
598
599 // *************************************************************************
600 // \8f\89\8aú\90Ý\92è\83t\83H\83\8b\83_
601 // *************************************************************************
602 function PreferencesFolder : PChar; stdcall;
603 begin
604
605         Result := CreateResultString( GikoSys.GetConfigDir );
606
607 end;
608
609 // *************************************************************************
610 // \8f\89\8aú\90Ý\92è\83t\83@\83C\83\8b
611 // *************************************************************************
612 function PreferencesFile : PChar; stdcall;
613 begin
614
615         Result := CreateResultString( GikoSys.GetAppDir + 'gikoNavi.ini' );
616
617 end;
618
619 // *************************************************************************
620 // \83\8d\83O\83t\83H\83\8b\83_
621 // *************************************************************************
622 function LogFolder : PChar; stdcall;
623 begin
624
625         Result := CreateResultString( GikoSys.GetAppDir + 'Log\' );
626
627 end;
628
629 // *************************************************************************
630 // CSS \83t\83H\83\8b\83_
631 // *************************************************************************
632 function CSSFolder : PChar; stdcall;
633 begin
634
635         Result := CreateResultString( GikoSys.GetStyleSheetDir );
636
637 end;
638
639 // *************************************************************************
640 // \83X\83L\83\93\82ð\93ü\82ê\82Ä\82¨\82­\83t\83H\83\8b\83_
641 // *************************************************************************
642 function SkinFolder : PChar; stdcall;
643 begin
644
645         Result := CreateResultString( GikoSys.GetSkinDir );
646
647 end;
648
649 // *************************************************************************
650 // \8eg\97p\82µ\82Ä\82¢\82é CSS / \83X\83L\83\93
651 // *************************************************************************
652 function SkinFile : PChar; stdcall;
653 begin
654
655         Result := CreateResultString( GikoSys.Setting.CSSFileName );
656
657 end;
658
659 // *************************************************************************
660 // \82 \82Ú\81[\82ñ\8bK\91¥\82ª\92u\82¢\82Ä\82 \82é\83f\83B\83\8c\83N\83g\83\8a
661 // *************************************************************************
662 function AbonFolder : PChar; stdcall;
663 begin
664
665         Result := CreateResultString( GikoSys.Setting.GetNGWordsDir );
666
667 end;
668
669 // *************************************************************************
670 // \8eg\97p\82µ\82Ä\82¢\82é\82 \82Ú\81[\82ñ\8bK\91¥
671 // *************************************************************************
672 function AbonFile : PChar; stdcall;
673 begin
674
675         Result := CreateResultString( GikoSys.FAbon.GetNGwordpath );
676
677 end;
678
679
680
681 // =========================================================================
682 // ThreadItem
683 // =========================================================================
684
685 // *************************************************************************
686 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
687 // *************************************************************************
688 function ThreadItemGetLong(
689         instance                : DWORD;
690         propertyID      : TThreadItemProperty
691 ) : DWORD; stdcall;
692 var
693         threadItem : TThreadItem;
694 begin
695
696         threadItem := TThreadItem( instance );
697         case propertyID of
698                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
699                         Result := threadItem.Context;
700                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
701                         Result := threadItem.No;
702                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
703                         Result := DWORD( CreateResultString( threadItem.FileName ) );
704                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
705                         Result := DWORD( CreateResultString( threadItem.Title ) );
706                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
707                         Result := threadItem.Count;
708                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
709                         Result := threadItem.AllResCount;
710                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
711                         Result := threadItem.NewResCount;
712                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
713                         Result := threadItem.Size;
714                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
715                         Result := DWORD( threadItem.Round );
716                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
717                         Result := DWORD( CreateResultString( threadItem.RoundName ) );
718                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
719                         Result := DWORD( threadItem.IsLogFile );
720                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
721                         Result := threadItem.Kokomade;
722                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
723                         Result := threadItem.NewReceive;
724                 tipNewArrival:                                  // : Boolean            // \90V\92\85
725                         Result := DWORD( threadItem.NewArrival );
726                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
727                         Result := DWORD( threadItem.UnRead );
728                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
729                         Result := threadItem.ScrollTop;
730                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
731                         Result := DWORD( CreateResultString( threadItem.DownloadHost ) );
732                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
733                         Result := DWORD( threadItem.AgeSage );
734                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
735                         Result := DWORD( CreateResultString( threadItem.URL ) );
736         tipFilePath:                                                                                                            // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
737                 Result := DWORD( CreateResultString( threadItem.FilePath ) );
738         else
739                 Result := 0;
740         end;
741 end;
742
743 // *************************************************************************
744 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
745 // *************************************************************************
746 procedure ThreadItemSetLong(
747         instance                : DWORD;
748         propertyID      : TThreadItemProperty;
749         param : DWORD
750 ); stdcall;
751 var
752         threadItem      : TThreadItem;
753 begin
754
755         threadItem := TThreadItem( instance );
756         case propertyID of
757                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
758                         threadItem.Context                      := param;
759                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
760                         threadItem.No                                           := param;
761                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
762                         threadItem.FileName                     := string( PChar( param ) );
763                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
764                         threadItem.Title                                := string( PChar( param ) );
765                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
766                         threadItem.Count                                := param;
767                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
768                         threadItem.AllResCount  := param;
769                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
770                         threadItem.NewResCount  := param;
771                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
772                         threadItem.Size                                 := param;
773                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
774                         threadItem.Round                                := Boolean( param );
775                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
776                         threadItem.RoundName            := string( PChar( param ) );
777                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
778                         threadItem.IsLogFile            := Boolean( param );
779                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
780                         threadItem.Kokomade                     := param;
781                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
782                         threadItem.NewReceive           := param;
783                 tipNewArrival:                                  // : Boolean            // \90V\92\85
784                         threadItem.NewArrival           := Boolean( param );
785                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
786                         threadItem.UnRead                               := Boolean( param );
787                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
788                         threadItem.ScrollTop             := param;
789                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
790                         threadItem.DownloadHost := string( PChar( param ) );
791                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
792                         threadItem.AgeSage                      := TGikoAgeSage( param );
793                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
794                         threadItem.URL                                  := string( PChar( param ) );
795         tipFilePath:                                            // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
796                 threadItem.FilePath                     := string( PChar( param ) );
797         end;
798
799 end;
800
801 // *************************************************************************
802 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
803 // *************************************************************************
804 function ThreadItemGetDouble(
805         instance                : DWORD;
806         propertyID      : TThreadItemProperty
807 ) : Double; stdcall;
808 var
809         threadItem : TThreadItem;
810 begin
811
812         threadItem := TThreadItem( instance );
813         case propertyID of
814                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
815                         Result := threadItem.RoundDate;
816                 tipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
817                         Result := threadItem.LastModified;
818         else
819                 Result := 0;
820         end;
821
822 end;
823
824 // *************************************************************************
825 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
826 // *************************************************************************
827 procedure ThreadItemSetDouble(
828         instance                : DWORD;
829         propertyID      : TThreadItemProperty;
830         param                           : Double
831 ); stdcall;
832 var
833         threadItem : TThreadItem;
834 begin
835
836         threadItem := TThreadItem( instance );
837         case propertyID of
838                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
839                         threadItem.RoundDate            := param;
840                 tipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
841                         threadItem.LastModified := param;
842         end;
843
844 end;
845
846 // *************************************************************************
847 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
848 // *************************************************************************
849 function ThreadItemDat2HTML(
850         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
851         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
852         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
853         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
854 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
855 var
856         threadItem : TThreadItem;
857         res : TResRec;
858         no : string;
859 begin
860
861         threadItem      := TThreadItem( inInstance );
862         // \88ø\90\94\82ð\95ª\89ð
863         res                                     := GikoSys.DivideStrLine( string( inDatRes ) );
864         no                                      := IntToStr( inResNo );
865
866         try
867                 if GikoSys.Setting.UseSkin then begin
868                         // \83X\83L\83\93
869                         if inIsNew then
870                                 Result := CreateResultString( GikoSys.SkinedRes(
871                                         GikoSys.LoadFromSkin(
872                                                 GikoSys.Setting.GetSkinNewResFileName, threadItem, 0
873                                         ), res, no
874                                 ) )
875                         else
876                                 Result := CreateResultString( GikoSys.SkinedRes(
877                                         GikoSys.LoadFromSkin(
878                                                 GikoSys.Setting.GetSkinResFileName, threadItem, 0
879                                         ), res, no
880                                 ) );
881                 end else begin
882                         // CSS or \83f\83t\83H\83\8b\83g
883                         if res.FName = '' then
884                                 res.FName := '&nbsp;';
885                         if res.FMailTo = '' then
886                                 Result := CreateResultString( '<a name="' + no + '"></a>'
887                                                                 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + no + '</a></span> '
888                                                                 + '<span class="name_label">\96¼\91O\81F</span> '
889                                                                 + '<span class="name"><b>' + res.FName + '</b></span> '
890                                                                 + '<span class="date_label">\93\8a\8de\93ú\81F</span> '
891                                                                 + '<span class="date">' + res.FDateTime+ '</span></div>'
892                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
893                         else if GikoSys.Setting.ShowMail then
894                                 Result := CreateResultString( '<a name="' + no + '"></a>'
895                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
896                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
897                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
898                                                                 + '<b>' + res.FName + '</b></a><span class="mail"> [' + res.FMailTo + ']</span>'
899                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
900                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
901                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
902                         else
903                                 Result := CreateResultString( '<a name="' + no + '"></a>'
904                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
905                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
906                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
907                                                                 + '<b>' + res.FName + '</b></a>'
908                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
909                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
910                                                                 + '<div class="mes">' + res.FBody + ' </div>' );
911                 end;
912         except
913                 Result := nil;
914         end;
915
916 end;
917
918 // *************************************************************************
919 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83w\83b\83_\82ð\8eæ\93¾\82·\82é
920 // *************************************************************************
921 function ThreadItemGetHeader(
922         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
923         inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
924 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
925 var
926         threadItem                              : TThreadItem;
927         skinHeader                              : string;
928         optionalHeader          : string;
929 begin
930
931         threadItem                      := TThreadItem( inInstance );
932         optionalHeader  := string( inOptionalHeader );
933         skinHeader                      := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinHeaderFileName, threadItem, 0 );
934         if Length( optionalHeader ) > 0 then
935                 skinHeader := StringReplace( skinHeader, '</head>',
936                         string( optionalHeader ) + '</head>', [rfReplaceAll] );
937
938         Result := CreateResultString( skinHeader );
939
940 end;
941
942 // *************************************************************************
943 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83t\83b\83^\82ð\8eæ\93¾\82·\82é
944 // *************************************************************************
945 function ThreadItemGetFooter(
946         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
947         inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
948 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
949 var
950         threadItem                              : TThreadItem;
951         skinFooter                              : string;
952         optionalFooter          : string;
953 begin
954
955         threadItem                      := TThreadItem( inInstance );
956         optionalFooter  := string( inOptionalFooter );
957         skinFooter                      := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinFooterFileName, threadItem, 0 );
958         if Length( optionalFooter ) > 0 then
959                 skinFooter := StringReplace( skinFooter, '</body>',
960                         string( optionalFooter ) + '</body>', [rfReplaceAll] );
961
962         Result := CreateResultString( skinFooter );
963
964 end;
965
966 // *************************************************************************
967 // \83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
968 // *************************************************************************
969 procedure ThreadItemWork(
970         inInstance      : DWORD;                        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
971         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
972 ); stdcall;
973 begin
974
975         if Assigned( OnWork ) then
976                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
977
978 end;
979
980 // *************************************************************************
981 // \83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
982 // *************************************************************************
983 procedure ThreadItemWorkBegin(
984         inInstance                      : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
985         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
986 ); stdcall;
987 begin
988
989         if Assigned( OnWorkBegin ) then
990                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
991
992 end;
993
994 // *************************************************************************
995 // \83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
996 // *************************************************************************
997 procedure ThreadItemWorkEnd(
998         inInstance      : DWORD                         // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
999 ); stdcall;
1000 begin
1001
1002         if Assigned( OnWorkEnd ) then
1003                 OnWorkEnd( TObject( inInstance ), wmRead );
1004
1005 end;
1006
1007 exports
1008         CreateResultString,
1009         DisposeResultString,
1010         VersionInfo,
1011         ApplicationFolder,
1012         PreferencesFolder,
1013         PreferencesFile,
1014         LogFolder,
1015         CSSFolder,
1016         SkinFolder,
1017         SkinFile,
1018         AbonFolder,
1019         AbonFile,
1020         InternalDownload,
1021         InternalAbon,
1022         InternalDat2HTML,
1023         ThreadItemGetLong,
1024         ThreadItemSetLong,
1025         ThreadItemGetDouble,
1026         ThreadItemSetDouble,
1027         ThreadItemDat2HTML,
1028         ThreadItemGetHeader,
1029         ThreadItemGetFooter,
1030         ThreadItemWork,
1031         ThreadItemWorkBegin,
1032         ThreadItemWorkEnd;
1033
1034 end.
1035