From: yoffy Date: Sat, 15 Nov 2003 17:52:00 +0000 (+0000) Subject: ・最新のプラグインインターフェースに対応。 X-Git-Tag: v1_64_1_820~1715 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e87f0b981cb4683f56f90590918cc9e0e5c481e9;p=gikonavigoeson%2Fgikonavi.git ・最新のプラグインインターフェースに対応。 --- diff --git a/res/ExternalBoardPlugIn/ExternalBoardPlugIn.dpr b/res/ExternalBoardPlugIn/ExternalBoardPlugIn.dpr index fed6045..2dddbd5 100644 --- a/res/ExternalBoardPlugIn/ExternalBoardPlugIn.dpr +++ b/res/ExternalBoardPlugIn/ExternalBoardPlugIn.dpr @@ -11,34 +11,130 @@ uses YofUtils in '..\..\YofUtils.pas', PlugInMain in 'PlugInMain.pas', ThreadItem in 'ThreadItem.pas', + BoardItem in 'BoardItem.pas', FilePath in 'FilePath.pas'; {$R *.res} type + // ========================================================================= + // T2chThreadItem + // ========================================================================= T2chThreadItem = class(TThreadItem) private FIsTemporary : Boolean; FDat : TStringList; public - constructor Create( inInstance : DWORD ); - destructor Destroy; override; + constructor Create( inInstance : DWORD ); + destructor Destroy; override; private - procedure Download; - function GetRes( inNo : Integer ) : string; - function GetHeader( inOptionalHeader : string ) : string; - function GetFooter( inOptionalFooter : string ) : string; + function Download : TDownloadState; + function GetRes( inNo : Integer ) : string; + function GetHeader( inOptionalHeader : string ) : string; + function GetFooter( inOptionalFooter : string ) : string; + end; + + // ========================================================================= + // T2chBoardItem + // ========================================================================= + T2chBoardItem = class(TBoardItem) + private + FIsTemporary : Boolean; + FDat : TStringList; + + public + constructor Create( inInstance : DWORD ); + destructor Destroy; override; + + private + function Download : TDownloadState; + function ToThreadURL( inFileName : string ) : string; + procedure EnumThread( inCallBack : TBoardItemEnumThreadCallBack ); + + end; + + // ========================================================================= + // ƒTƒuƒWƒFƒNƒgƒŒƒR[ƒh + // ========================================================================= + TSubjectRec = record + FFileName: string; + FTitle: string; + FCount: Integer; end; const - PLUGIN_NAME = 'External2chReader'; + LOG_DIR = '2ch\'; + + PLUGIN_NAME = '2chPlugIn'; MAJOR_VERSION = 1; MINOR_VERSION = 0; - RELEASE_VERSION = 'develop'; + RELEASE_VERSION = 'alpha'; REVISION_VERSION = 1; +// ========================================================================= +// ŽG—pŠÖ” +// ========================================================================= + +// ************************************************************************* +// ƒeƒ“ƒ|ƒ‰ƒŠ‚ȃpƒX‚̎擾 +// ************************************************************************* +function TemporaryFile : string; +var + tempPath : array [0..MAX_PATH] of char; +begin + + GetTempPath( SizeOf(tempPath), tempPath ); + repeat + Result := tempPath + IntToStr( Random( $7fffffff ) ); + until not FileExists( Result ); + +end; + +// ************************************************************************* +// ‚Ü‚¿BBS—pƒƒOƒtƒHƒ‹ƒ_Žæ“¾ +// ************************************************************************* +function MyLogFolder : string; +var + folder : string; +begin + + folder := LogFolder; + if Length( folder ) = 0 then + Result := '' + else + Result := folder + LOG_DIR; + +end; + +(************************************************************************* + *ƒfƒBƒŒƒNƒgƒŠ‚ª‘¶Ý‚·‚é‚©ƒ`ƒFƒbƒN + *************************************************************************) +function DirectoryExistsEx(const Name: string): Boolean; +var + Code: Integer; +begin + Code := GetFileAttributes(PChar(Name)); + Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); +end; + +(************************************************************************* + *ƒfƒBƒŒƒNƒgƒŠì¬i•¡”ŠK‘w‘Ήžj + *************************************************************************) +function ForceDirectoriesEx(Dir: string): Boolean; +begin + Result := True; + if Length(Dir) = 0 then + raise Exception.Create('ƒtƒHƒ‹ƒ_‚ªì¬o—ˆ‚Ü‚¹‚ñ'); + Dir := ExcludeTrailingPathDelimiter(Dir); + if (Length(Dir) < 3) or DirectoryExistsEx(Dir) + or (ExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem. + Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir); +end; + + + // ************************************************************************* // ƒvƒ‰ƒOƒCƒ“‚̃o[ƒWƒ‡ƒ“‚ð—v‹‚³‚ꂽ // ************************************************************************* @@ -51,9 +147,6 @@ procedure OnVersionInfo( ); stdcall; begin - {$IFDEF DEBUG} - Writeln('OnVersionInfo'); - {$ENDIF} outAgent := CreateResultString( PChar( PLUGIN_NAME ) ); outMajor := MAJOR_VERSION; outMinor := MINOR_VERSION; @@ -75,9 +168,6 @@ const BBS_HOST = '2ch.net'; begin - {$IFDEF DEBUG} - Writeln('OnAcceptURL'); - {$ENDIF} // —á‚Æ‚µ‚ăzƒXƒg–¼‚ª 2ch.net ‚ŏI‚í‚éê‡‚͎󂯕t‚¯‚é‚悤‚É‚µ‚Ä‚¢‚é URI := TIdURI.Create( inURL ); try @@ -89,25 +179,11 @@ begin end; -// ************************************************************************* -// Žw’肵‚½ƒXƒŒˆê——‚̃_ƒEƒ“ƒ[ƒh‚ð—v‹‚³‚ꂽ -// –ß‚è’l‚Í‚»‚Ì‚Ü‚Ü Subject.txt ‚É•Û‘¶‚³‚ê‚é -// ************************************************************************* -function OnDownloadList( - inURL : PChar // ƒ_ƒEƒ“ƒ[ƒh‚·‚éƒXƒŒˆê——‚ðŽ¦‚µ‚½ URL -) : PChar; stdcall; // ƒXƒŒƒbƒh–¼‚̈ꗗ‚ð•\‚µ‚½‰üs‹æØ‚èƒeƒLƒXƒg -var - modified : Double; -begin - {$IFDEF DEBUG} - Writeln('OnDownloadList'); - {$ENDIF} - // “ÆŽ©‚Ƀ_ƒEƒ“ƒ[ƒh‚âƒtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í - // InternalDownload ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é - InternalDownload( inURL, modified, Result ); -end; +// ========================================================================= +// T2chThreadItem +// ========================================================================= // ************************************************************************* // ƒRƒ“ƒXƒgƒ‰ƒNƒ^ @@ -129,14 +205,13 @@ begin FilePath := ''; FIsTemporary := False; + FDat := nil; - Randomize; - - uri := TIdURI.Create( URL ); - uriList := TStringList.Create; + uri := TIdURI.Create( URL ); + uriList := TStringList.Create; try YofUtils.ExtractHttpFields( ['/', '?'], [], uri.Path, uriList ); - FilePath := LogFolder + '2ch\' + uriList.Strings[ 3 ] + '\' + uriList.Strings[ 4 ] + '.dat'; + FilePath := MyLogFolder + '2ch\' + uriList.Strings[ 3 ] + '\' + uriList.Strings[ 4 ] + '.dat'; IsLogFile := FileExists( FilePath ); finally uri.Free; @@ -151,8 +226,13 @@ end; destructor T2chThreadItem.Destroy; begin - if FDat <> nil then - FDat.Free; + if FDat <> nil then begin + try + FDat.Free; + FDat := nil; + except + end; + end; // ˆêŽžƒtƒ@ƒCƒ‹‚̏ꍇ‚͍폜‚·‚é if FIsTemporary then @@ -163,44 +243,31 @@ begin end; // ************************************************************************* -// ƒeƒ“ƒ|ƒ‰ƒŠ‚ȃpƒX‚̎擾(ŽG—pŠÖ”) -// ************************************************************************* -function TemporaryFile : string; -var - tempPath : array [0..MAX_PATH] of char; -begin - - GetTempPath( SizeOf(tempPath), tempPath ); - repeat - Result := tempPath + IntToStr( Random( $7fffffff ) ); - until not FileExists( Result ); - -end; - -// ************************************************************************* // Žw’肵‚½ URL ‚̃XƒŒƒbƒh‚̃_ƒEƒ“ƒ[ƒh‚ðŽwŽ¦‚³‚ꂽ // ************************************************************************* -procedure T2chThreadItem.Download; +function T2chThreadItem.Download : TDownloadState; var modified : Double; - tmp : PChar; + tmp, tmp2 : PChar; + tmpLen : Integer; responseCode : Longint; logStream : TFileStream; uri : TIdURI; uriList : TStringList; datURL : string; + lastChar : Char; + downResult : TStringList; begin - {$IFDEF DEBUG} - Writeln('Download'); - {$ENDIF} + Result := dsError; + uri := TIdURI.Create( URL ); uriList := TStringList.Create; try YofUtils.ExtractHttpFields( ['/', '?'], [], uri.Path, uriList ); // http://pc2.2ch.net/test/read.cgi/software/1065250336/l50 // protocol://host/1/2/3/4/uriList.Count - 1 - if LogFolder = '' then begin + if MyLogFolder = '' then begin // ‚Ç‚±‚É•Û‘¶‚µ‚Ä‚¢‚¢‚Ì‚©•ª‚©‚ç‚È‚¢‚̂ňꎞƒtƒ@ƒCƒ‹‚É•Û‘¶ FilePath := TemporaryFile; FIsTemporary := True; @@ -208,42 +275,79 @@ begin FilePath := LogFolder + '2ch\' + uriList.Strings[ 3 ] + '\' + uriList.Strings[ 4 ] + '.dat'; end; - if FileExists( FilePath ) then - logStream := TFileStream.Create( FilePath, fmOpenReadWrite or fmShareDenyWrite ) - else - logStream := TFileStream.Create( FilePath, fmCreate or fmShareDenyWrite ); - try - // “ÆŽ©‚Ƀ_ƒEƒ“ƒ[ƒh‚âƒtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í - // InternalDownload ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é - modified := LastModified; - // http://pc2.2ch.net/software/1000000000.dat - datURL := - uri.Protocol + '://' + uri.Host + '/' + - uriList.Strings[ 3 ] + '/dat/' + uriList.Strings[ 4 ] + '.dat'; - responseCode := InternalDownload( PChar( datURL ), modified, tmp, Max( 0, logStream.Size - 1 ) ); - - {$IFDEF DEBUG} - Writeln( 'responseCode:' + IntToStr( responseCode ) ); - {$ENDIF} - if responseCode = 200 then begin - LastModified := modified; - IsLogFile := True; - - logStream.Position := Max( 0, logStream.Size - 1 ); - logStream.Write( tmp^, StrLen( tmp ) ); - end; - - DisposeResultString( tmp ); - finally - logStream.Free; - end; + // •Û‘¶—p‚̃fƒBƒŒƒNƒgƒŠ‚ðŒ@‚é + ForceDirectoriesEx( Copy( FilePath, 1, LastDelimiter( '\', FilePath ) ) ); + + if FileExists( FilePath ) then + logStream := TFileStream.Create( FilePath, fmOpenReadWrite or fmShareDenyWrite ) + else + logStream := TFileStream.Create( FilePath, fmCreate or fmShareDenyWrite ); + try + // “ÆŽ©‚Ƀ_ƒEƒ“ƒ[ƒh‚âƒtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í + // InternalDownload ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é + modified := LastModified; + // http://pc2.2ch.net/software/1000000000.dat + datURL := + uri.Protocol + '://' + uri.Host + '/' + + uriList.Strings[ 3 ] + '/dat/' + uriList.Strings[ 4 ] + '.dat'; + responseCode := InternalDownload( PChar( datURL ), modified, tmp, Max( 0, logStream.Size - 1 ) ); + + try + if responseCode = 200 then begin + downResult := TStringList.Create; + try + tmpLen := StrLen( tmp ); + + IsLogFile := True; + + if Count = 0 then begin + Result := dsComplete; + end else begin + Result := dsDiffComplete; + logStream.Position := Max( 0, logStream.Size - 1 ); + logStream.Read( lastChar, 1 ); + end; + if (Count = 0) or (lastChar = tmp^) then begin + downResult.Text := string( tmp + 1 ); // ƒJƒEƒ“ƒg‚Ì‚½‚ß‚¾‚¯ + logStream.Write( (tmp + 1)^, tmpLen - 1 ); + + LastModified := modified; + NewReceive := Count + 1; + Count := Count + downResult.Count; + NewResCount := downResult.Count; + end else begin + Result := dsAbort; + modified := LastModified; + responseCode := InternalDownload( + PChar( datURL ), modified, tmp2, 0, logStream.Size - 1 ); + logStream.Position := 0; + logStream.Write( tmp2, StrLen( tmp2 ) ); + logStream.Write( tmp, tmpLen ); + + downResult.Text := string( tmp2 ) + string( tmp ); // ƒJƒEƒ“ƒg‚Ì‚½‚ß‚¾‚¯ + + LastModified := modified; + if downResult.Count > Count then + NewReceive := Count + 1 + else + NewReceive := 1; + Count := downResult.Count; + NewResCount := Count - NewReceive + 1; + end; + finally + downResult.Free; + end; + end; + finally + DisposeResultString( tmp ); + end; + finally + logStream.Free; + end; finally uri.Free; uriList.Free; end; - {$IFDEF DEBUG} - Writeln('Download ‚É—áŠO‚È‚µ'); - {$ENDIF} end; @@ -258,17 +362,25 @@ var tmp : PChar; begin - {$IFDEF DEBUG} - Writeln('GetRes'); - {$ENDIF} // “ÆŽ©‚ɃtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í // InternalAbon ‚¨‚æ‚Ñ Dat2HTML ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é + if FDat = nil then begin + if IsLogFile then begin + // dat ‚̓ǂݍž‚Ý + FDat := TStringList.Create; + FDat.LoadFromFile( FilePath ); + end else begin + // ƒƒO‚É‘¶Ý‚µ‚È‚¢‚Ì‚Å‚±‚̂܂܏I—¹ + Result := ''; + Exit; + end; + end; + res := FDat[ inNo - 1 ]; + tmp := InternalAbon( PChar( res ) ); try - res := FDat[ inNo - 1 ]; - tmp := InternalAbon( PChar( res ) ); Result := Dat2HTML( string( tmp ), inNo ); + finally DisposeResultString( tmp ); - except end; end; @@ -281,22 +393,25 @@ function T2chThreadItem.GetHeader( ) : string; begin - {$IFDEF DEBUG} - Writeln('GetHeader'); - {$ENDIF} // “ÆŽ©‚ɃtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í // InternalHeader ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é - Result := InternalHeader( inOptionalHeader ); + Result := InternalHeader( + '' + + inOptionalHeader ); + // GetRes ‚ðŒÄ‚΂ê‚邱‚Æ‚ª—\‘z‚³‚ê‚é‚Ì‚Å FDat ‚𐶐¬‚µ‚Ä‚¨‚­ - try - if FDat <> nil then + if FDat <> nil then begin + try FDat.Free; - if IsLogFile then begin - FDat := TStringList.Create; - FDat.LoadFromFile( FilePath ); + FDat := nil; + except end; - except + end; + if IsLogFile then begin + // dat ‚̓ǂݍž‚Ý + FDat := TStringList.Create; + FDat.LoadFromFile( FilePath ); end; end; @@ -309,17 +424,16 @@ function T2chThreadItem.GetFooter( ) : string; begin - {$IFDEF DEBUG} - Writeln('GetFooter'); - {$ENDIF} // “ÆŽ©‚ɃtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í // InternalFooter ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é Result := InternalFooter( inOptionalFooter ); // ‚à‚¤ GetRes ‚͌Ă΂ê‚È‚¢‚ÆŽv‚¤‚Ì‚Å FDat ‚ðŠJ•ú‚µ‚Ä‚¨‚­ try - if FDat <> nil then + if FDat <> nil then begin FDat.Free; + FDat := nil; + end; except end; @@ -355,9 +469,253 @@ begin end; +// ========================================================================= +// T2chBoardItem +// ========================================================================= + // ************************************************************************* -// ƒGƒ“ƒgƒŠƒ|ƒCƒ“ƒg +// ƒRƒ“ƒXƒgƒ‰ƒNƒ^ +// ************************************************************************* +constructor T2chBoardItem.Create( + inInstance : DWORD +); +var + uri : TIdURI; + uriList : TStringList; +begin + + inherited; + + OnDownload := Download; + OnEnumThread := EnumThread; + OnFileName2ThreadURL := ToThreadURL; + + FilePath := ''; + FIsTemporary := False; + FDat := nil; + + if Copy( URL, Length( URL ), 1 ) = '/' then + uri := TIdURI.Create( URL ) + else + uri := TIdURI.Create( URL + '/' ); + uriList := TStringList.Create; + try + YofUtils.ExtractHttpFields( ['/', '?'], [], uri.Path, uriList ); + // http://2ch.net/hoge/subject.txt + FilePath := MyLogFolder + uriList[ 1 ] + '\' + uri.Document; + IsLogFile := FileExists( FilePath ); + finally + uri.Free; + uriList.Free; + end; + +end; + +// ************************************************************************* +// ƒfƒXƒgƒ‰ƒNƒ^ +// ************************************************************************* +destructor T2chBoardItem.Destroy; +begin + + if FDat <> nil then begin + try + FDat.Free; + FDat := nil; + except + end; + end; + + // ˆêŽžƒtƒ@ƒCƒ‹‚̏ꍇ‚͍폜‚·‚é + if FIsTemporary then + DeleteFile( FilePath ); + + inherited; + +end; + +// ************************************************************************* +// Žw’肵‚½ƒXƒŒˆê——‚̃_ƒEƒ“ƒ[ƒh‚ð—v‹‚³‚ꂽ +// ************************************************************************* +function T2chBoardItem.Download : TDownloadState; +var + modified : Double; + downResult : PChar; + responseCode : Longint; + uri : TIdURI; + uriList : TStringList; +const + SUBJECT_NAME = 'subject.txt'; +begin + + Result := dsError; + + if Copy( URL, Length( URL ), 1 ) = '/' then + uri := TIdURI.Create( URL + SUBJECT_NAME ) + else + uri := TIdURI.Create( URL ); + uriList := TStringList.Create; + if FDat <> nil then begin + try + FDat.Free; + FDat := nil; + except + end; + end; + FDat := TStringList.Create; + // “ÆŽ©‚Ƀ_ƒEƒ“ƒ[ƒh‚âƒtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í + // InternalDownload ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é + modified := LastModified; + responseCode := InternalDownload( PChar( uri.URI ), modified, downResult ); + try + if responseCode = 200 then begin + try + // ƒpƒX‚ðŽZo + YofUtils.ExtractHttpFields( ['/', '?'], [], uri.Path, uriList ); + if MyLogFolder = '' then begin + // ‚Ç‚±‚É•Û‘¶‚µ‚Ä‚¢‚¢‚Ì‚©•ª‚©‚ç‚È‚¢‚̂ňꎞƒtƒ@ƒCƒ‹‚É•Û‘¶ + FilePath := TemporaryFile; + FIsTemporary := True; + end else begin + FilePath := MyLogFolder + uriList[ 1 ] + '\' + uri.Document; + FIsTemporary := False + end; + + // •Û‘¶—p‚̃fƒBƒŒƒNƒgƒŠ‚ðŒ@‚é + ForceDirectoriesEx( Copy( FilePath, 1, LastDelimiter( '\', FilePath ) ) ); + + FDat.Text := string( downResult ); + // •Û‘¶ + FDat.SaveToFile( FilePath ); + finally + uri.Free; + uriList.Free; + end; + Result := dsComplete; + end; + finally + DisposeResultString( downResult ); + end; + +end; + +// ************************************************************************* +// ƒXƒŒˆê——‚Ì URL ‚©‚çƒXƒŒƒbƒh‚Ì URL ‚𓱂«o‚· +// ************************************************************************* +function T2chBoardItem.ToThreadURL( + inFileName : string // ƒXƒŒƒbƒhƒtƒ@ƒCƒ‹–¼ +) : string; // ƒXƒŒƒbƒh‚Ì URL +var + threadURL : string; + uri : TIdURI; + uriList : TStringList; + found : Integer; +begin + + found := Pos( '.', inFileName ); + if found > 0 then + inFileName := Copy( inFileName, 1, found - 1 ); + if Copy( URL, Length( URL ), 1 ) = '/' then + uri := TIdURI.Create( URL ) + else + uri := TIdURI.Create( URL + '/' ); + uriList := TStringList.Create; + + try + try + // http://book.2ch.net/bizplus/subject.txt + // http://book.2ch.net/test/read.cgi/bizplus/1068905348/l50 + YofUtils.ExtractHttpFields( ['/', '?'], [], uri.Path, uriList ); + threadURL := uri.Protocol + '://' + uri.Host + '/test/read.cgi/' + + uriList[ 1 ] + '/' + inFileName + '/l50'; + Result := threadURL; + finally + uri.Free; + uriList.Free; + end; + except + Result := ''; + end; + +end; + +// ************************************************************************* +// ‚±‚̔‚ɂ¢‚­‚‚̃XƒŒ‚ª‚ ‚é‚©—v‹‚³‚ꂽ +// ************************************************************************* +procedure T2chBoardItem.EnumThread( + inCallBack : TBoardItemEnumThreadCallBack +); +var + uri : TIdURI; + uriList : TStringList; +const + SUBJECT_NAME = 'subject.txt'; +begin + + try + if FDat = nil then begin + FDat := TStringList.Create; + + if Copy( URL, Length( URL ), 1 ) = '/' then + uri := TIdURI.Create( URL + SUBJECT_NAME ) + else + uri := TIdURI.Create( URL ); + uriList := TStringList.Create; + try + // ƒpƒX‚ðŽZo + YofUtils.ExtractHttpFields( ['/', '?'], [], uri.Path, uriList ); + // http://book.2ch.net/bizplus/subject.txt + FilePath := MyLogFolder + uriList[ 1 ] + '\' + uri.Document; + if FileExists( FilePath ) then + // “ǂݍž‚Ý + FDat.LoadFromFile( FilePath ); + finally + uri.Free; + uriList.Free; + end; + end; + + // “ÆŽ©‚ɃtƒBƒ‹ƒ^ƒŠƒ“ƒO‚ðs‚í‚È‚¢ê‡‚Í EnumThread ‚É”C‚¹‚邱‚Æ‚ªo—ˆ‚é + inherited EnumThread( inCallBack, FDat.Text ); + except + end; + +end; + +// ************************************************************************* +// TBoardItem ‚ª¶¬‚³‚ꂽê‡‚̏ˆ’u(T2chBoardItem ‚𐶐¬‚·‚é) +// ************************************************************************* +procedure BoardItemOnCreateOfT2chBoardItem( + inInstance : DWORD +); +var + boardItem : T2chBoardItem; +begin + + boardItem := T2chBoardItem.Create( inInstance ); + BoardItemSetLong( inInstance, bipContext, DWORD( boardItem ) ); + +end; + // ************************************************************************* +// TBoardItem ‚ª”jŠü‚³‚ꂽê‡‚̏ˆ’u(T2chBoardItem ‚ð”jŠü‚·‚é) +// ************************************************************************* +procedure BoardItemOnDisposeOfT2chBoardItem( + inInstance : DWORD +); +var + boardItem : T2chBoardItem; +begin + + boardItem := T2chBoardItem( BoardItemGetLong( inInstance, bipContext ) ); + boardItem.Free; + +end; + + + +// ========================================================================= +// ƒGƒ“ƒgƒŠƒ|ƒCƒ“ƒg +// ========================================================================= procedure DLLEntry( ul_reason_for_call : DWORD ); @@ -368,15 +726,21 @@ begin case ul_reason_for_call of DLL_PROCESS_ATTACH: begin + Randomize; + module := GetModuleHandle( nil ); LoadInternalAPI( module ); LoadInternalFilePathAPI( module ); LoadInternalThreadItemAPI( module ); + LoadInternalBoardItemAPI( module ); // ===== ƒCƒ“ƒXƒ^ƒ“ƒX‚ÌŽæ‚舵‚¢‚ð TThreadItem ‚©‚ç T2chThreadItem ‚ɕύX‚·‚é ThreadItemOnCreate := ThreadItemOnCreateOfT2chThreadItem; ThreadItemOnDispose := ThreadItemOnDisposeOfT2chThreadItem; + // ===== ƒCƒ“ƒXƒ^ƒ“ƒX‚ÌŽæ‚舵‚¢‚ð TBoardItem ‚©‚ç T2chBoardItem ‚ɕύX‚·‚é + BoardItemOnCreate := BoardItemOnCreateOfT2chBoardItem; + BoardItemOnDispose := BoardItemOnDisposeOfT2chBoardItem; end; DLL_PROCESS_DETACH: ; @@ -390,8 +754,7 @@ end; exports OnVersionInfo, - OnAcceptURL, - OnDownloadList; + OnAcceptURL; begin