算MD5時TFileStream.Creat 開svchost.exe失敗 |
缺席
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
算 hashvalue 時 TFileStream.Create 開啟 svchost.exe 失敗, 錯誤訊息
C:\Windows\system32\svchost.exe 程序無法存取檔案, 因為檔案正由另一個程序使用程式碼 function MD5File(sFileName:String):String; Var Digest: T4x4LongWordRecord; S, S1: String; i: Integer; md5: TIdHashMessageDigest5; fs : TFileStream; FileHandle : Integer; begin SetLength(S, 16); md5:=TIdHashMessageDigest5.Create; try fs := TFileStream.Create(sFileName, fmOpenRead) except //raise Exception.Create('Could not open the input file for read access.'); end; Digest :=md5.HashValue(fs); Move(Digest, S[1], 16); for i := 1 to Length(S) do begin S1 := S1 Format('x', [Byte(S[i])]); end; while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0'; Result:=S1; md5.Free; end;有辦法開啟 svchost.exe 計算 md5 值嗎 ? 謝謝 發表人 - pcboy2 於 2004/09/24 12:30:05
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
改用下面方法, 結果不管開啟任何檔案, 在 Digest :=md5.HashValue(fs); 就停住了
function MD5File(sFileName:String):String; Var Digest: T4x4LongWordRecord; S, S1: String; i: Integer; md5: TIdHashMessageDigest5; fs : TFileStream; FileHandle : Integer; begin SetLength(S, 16); md5:=TIdHashMessageDigest5.Create; FileHandle := FileOpen(sFileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then begin fs := TFileStream.Create(FileHandle); Digest :=md5.HashValue(fs); Move(Digest, S[1], 16); for i := 1 to Length(S) do begin S1 := S1 Format('x', [Byte(S[i])]); end; while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0'; Result:=S1; md5.Free; end else Result := 'N/A'; end;
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好 看了你的程式有幾點問題, 以紅色標註並說明 function MD5File1(sFileName:String):String; Var Digest: T4x4LongWordRecord; S, S1: String; i: Integer; md5: TIdHashMessageDigest5; fs : TFileStream; FileHandle : Integer; begin SetLength(S, 16); { 你這段應該是要判斷檔案存在與否,我覺得你該修正, 但就算不修正也不是主要的錯誤. 1 有 FileExists 可以使用 2 你沒有釋放 FileHandle } // FileHandle := FileOpen(sFileName, fmOpenWrite or fmShareDenyNone); // if FileHandle > 0 then if FileExists (sFileName) then begin { 檔案存在時再建立物件,不要無謂浪費系統資源 } md5:=TIdHashMessageDigest5.Create; { 這是你的致命傷,fs 呼叫的方式並不是這樣的, 下面是呼叫的方式 constructor Create(const FileName: string; Mode: Word); overload; constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload; } // fs := TFileStream.Create(FileHandle); fs := TFileStream.Create(sFileName, fmOpenRead); try Digest :=md5.HashValue(fs); Move(Digest, S[1], 16); for i := 1 to Length(S) do begin S1 := S1 Format('x', [Byte(S[i])]); end; while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0'; Result:=S1; 善用 try ... finally 來釋放資源 finally md5.Free; fs.Free; end; end else Result := 'N/A'; end; |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
這是你的致命傷,fs 呼叫的方式並不是這樣的, 下面是呼叫的方式 constructor Create(const FileName: string; Mode: Word); overload; constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload; } // fs := TFileStream.Create(FileHandle);小弟輸入到 fs := TFileStream.Create( 畫面跳出有 3 種方式 還一種是 AHandle : Integer; 原因原先用的方式失敗, 所以改用其他方式試試看
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdHash, IdHashMessageDigest; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function MD5File(sFileName:String):String; Var Digest: T4x4LongWordRecord; S, S1: String; i: Integer; md5: TIdHashMessageDigest5; fs : TFileStream; begin SetLength(S, 16); if FileExists (sFileName) then begin md5:=TIdHashMessageDigest5.Create; try // fs := TFileStream.Create(sFileName, fmOpenRead or fmShareDenyWrite) fs := TFileStream.Create(sFileName, fmOpenRead); Digest :=md5.HashValue(fs); Move(Digest, S[1], 16); for i := 1 to Length(S) do begin S1 := S1 Format('x', [Byte(S[i])]); end; while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0'; Result:=S1; finally md5.Free; fs.Free; end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(MD5File('c:\windows\system32\svchost.exe')); ShowMessage(MD5File('C:\WINDOWS\SYSTEM32\DRIVERS\ATAPI.SYS')); end; end.c:\windows\system32\svchost.exe 可以算出結果 怪, 原本不行, 可能是 fs.Free; 沒寫, 原本的程式是完整程式中的一個函式, 有計算 svchost.exe 不只一次, 為了減少其他影響, 這次只做完整小測試 但是這次換別的出問題錯誤訊息 : C:\Windows\system32\drivers\atapi.sys 程序無法存取檔案, 因為檔案正由另一個程序使用
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
magicbear
一般會員 發表:5 回覆:10 積分:3 註冊:2004-11-20 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |