【如何將純文字檔TEXT含在Res,且取得不暫存在硬碟】 |
答題得分者是:pceyes
|
andyto202
一般會員 發表:10 回覆:29 積分:7 註冊:2006-12-07 發送簡訊給我 |
我講一下我的操作流程
[code delphi] unit auto; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls, Activex, Menus; type TForm1 = class(TForm) B1: TButton; WebBrowser1: TWebBrowser; Label1: TLabel; ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure LoginUrl2(Ur2:String); public { Public declarations } end; var Form1: TForm1; logon:Boolean; implementation var AppPath:string; {$R *.DFM} procedure TForm1.LoginUrl2(Ur2:String); var docs,edits:OleVariant; begin WebBrowser1.Navigate(Ur2); end; procedure TForm1.FormCreate(Sender: TObject); begin AppPath:=ExtractFilePath(Application.ExeName); end; procedure TForm1.Button1Click(Sender: TObject); begin LoginUrl2(apppath 'abc.htm'); end; end. [/code] 1.用記筆本加入 myhtm htm abc.htm 並存成 abc.rc 2.brcc32 abc.rc 並產生了 abc.res 3.在{$R *.DFM}之後加入了{$R abc.res} 請問這樣子後 我要如何將 procedure TForm1.Button1Click(Sender: TObject); begin LoginUrl2(apppath 'abc.htm'); end; 這段用res來取代呢 之前討論的 先生: 流程應該是這樣的: 1. 由res載入文件後(所以要你重新開新版嘛!") 我已經另外開版了^_^ 2. 若照 pcslxl 大的做法,是基本做法,要save to file,再重新由硬碟載入HTM執行,這應該不是你要的,只要存到硬碟後,就算刪除,還是可以用軟體抓回來看帳號密碼的 ;另外RES是不能含入全文字檔TEXT的,要以stringtable方式存在的。 我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了 3. 應該要以TMemoryStream方式在程式內部取得文字檔。 這部份我聽的不是很懂說>_< 4. 之前PO給你的TextToWebBrowser(stream.text,WebBrowser1); 應該可以用了(已切合主題了),再將3取得的文字檔填入即可。 這個的確可以解決,不過好像是res好像比較正統(不過不知道是不是res檔要搭配exe檔才有用) 編輯記錄
andyto202 重新編輯於 2008-12-17 12:39:38, 註解 無‧
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
假設你的RC內容如下,你也會用BRC32編譯成myhtm.RES
請注意,你要標準的RC,困難在於它要用 " 全改成 OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object ListBox1: TListBox Left = 16 Top = 16 Width = 105 Height = 401 ItemHeight = 13 TabOrder = 0 OnClick = ListBox1Click end object Memo1: TMemo Left = 136 Top = 16 Width = 529 Height = 401 Lines.Strings = ( 'Memo1') TabOrder = 1 end end [/code] ResourceLocalizer.pas [code delphi] unit ResourceLocalizer; interface uses Classes, Windows; type TResourceLocalizer = class class procedure GetGroup(const Strings : TStrings); class function GetOneString(const Offset, Position : integer) : string; end; implementation const MaxBuffer = 255; { TResourceLocalizer } // 自stringtable取得群組名稱 class procedure TResourceLocalizer.GetGroup(const Strings : TStrings); const delta = 1000; // 移動間距 var buffer : array[0..MaxBuffer] of char; ls : integer; position : integer; begin position := delta; Strings.Clear; ls := LoadString(hInstance, position, buffer, sizeof(buffer)); while ls <> 0 do begin Strings.AddObject(buffer, TObject(position)); position := position delta; ls := LoadString(hInstance, position, buffer, sizeof(buffer)); end; end; // 僅能取得單一字串 // TResourceLocalizer.GetString(2000,1); 表示取得 2001單一字串 class function TResourceLocalizer.GetOneString(const Offset, Position: integer) : string; var buffer : array[0..MaxBuffer] of char; ls : integer; begin Result := ''; ls := LoadString(hInstance, Offset Position, buffer, sizeof(buffer)); if ls <> 0 then begin Result := buffer; end; end; end. [/code]
------
努力會更接近成功 |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
※注意此方法即與前一篇 pcslxl 所說的一樣!!! 此方法才是您需要的正解!
1、將您打的 htm 存好,例如叫 myHtm.html 2、編輯一個檔案叫 myHtm.rc 裡面打上 如下的內容 htm Media 檔案路徑 ※※※ 注意,路徑的地方,請不要有空白,不要有中文,一個斜線要打兩個斜線 例: 如果放在 D:\Test\Htm 的路徑下 則要打成 htm Media D:\\Test\\Htm\\myHtm.html 補充: 如果有多個檔案的話,那就可以寫成 htm1 Media 檔案路徑 htm2 Media 檔案路徑 htm3 ..... : : 3、執行 brcc32 myHtm.rc 後就會跑出一個 myHtm.res 的檔案 之後程式如下面這樣寫 (先 Copy 您的) [code delphi] unit auto; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls, Activex, Menus; type TForm1 = class(TForm) B1: TButton; WebBrowser1: TWebBrowser; Label1: TLabel; ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure LoginUrl2(Ur2:String); public { Public declarations } end; var Form1: TForm1; logon:Boolean; implementation var AppPath:string; {$R *.DFM} {$R myHtm.res} procedure TForm1.LoginUrl2(Ur2:String); var docs,edits:OleVariant; begin WebBrowser1.Navigate(Ur2); end; procedure TForm1.FormCreate(Sender: TObject); begin AppPath := ExtractFilePath(Application.ExeName); end; procedure TForm1.Button1Click(Sender: TObject); var sFilename: String; begin sFilename := 'abc.htm'; with TResourceStream.Create(HInstance, 'htm', 'Media') do try try SaveToFile(AppPath sFilename ); LoginUrl2(AppPath sFilename); DeleteFile(AppPath sFilename); except end; finally Free; end; end; end. [/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-12-17 16:49:10, 註解 無‧
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
感謝 careychen 指正!
他的方法確實是簡單明瞭,我上面的方法也是可以用(那是為了多國語言改的),但仍不算正解, 不過我仍然堅持不要刪除的做法,用MemoryStream的方式轉成TextToWebBrowser顯示,參考一下吧! 敬待 careychen 大大再次指正。 [code delphi] unit unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSHTML,ActiveX, SHDocVw; type TForm1 = class(TForm) WebBrowser1: TWebBrowser; Label1: TLabel; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; logon:Boolean; implementation var AppPath:string; {$R *.DFM} {$R myHtm.res} procedure TextToWebBrowser(ASrc: string; AWebBrowser: TWebBrowser); var vv: Variant; HTMLDocument: IHTMLDocument2; begin vv := VarArrayCreate([0,0],varVariant); vv[0] := ASrc; HTMLDocument := AWebBrowser.Document as IHTMLDocument2; HTML(pSafearray(TVarData(vv).VArray)); HTMLDocument.close; end; procedure TForm1.Button1Click(Sender: TObject); var mystream : Tmemorystream; s : string; begin with TResourceStream.Create(HInstance, 'htm', 'Media') do try try mystream := TMemorystream.Create; try SaveToStream(mystream); // 存到memorystream SetLength(S,mystream.Size); // 初設S字串的大小 mystream.Position:=0; mystream.Read(S[1],mystream.Size); Memo1.Lines.Add(S); // 將S讀入Memo1 TextToWebBrowser(memo1.Lines.Text,WebBrowser1); // 將字串直接讀入WebBrowser1 finally mystream.free; end; except end; finally Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin AppPath := ExtractFilePath(Application.ExeName); webbrowser1.Navigate('about:blank'); end; end. [/code]
------
努力會更接近成功 |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
不敢不敢,前輩您言重了,小弟覺得您上面的作法非常棒,小弟的回文只是依其需求回應
我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了 而小弟是比較希望發問者有空間自己去想想,不是把程式全部丟出去,讓發問者思考一下而已, 因為本篇的文其實在前一篇時有前輩已經提示了,所以希望發問者能自己再好好想一下。 ===================引 用 pceyes 文 章=================== 感謝 careychen 指正! 他的方法確實是簡單明瞭,我上面的方法也是可以用(那是為了多國語言改的),但仍不算正解, 不過我仍然堅持不要刪除的做法,用MemoryStream的方式轉成TextToWebBrowser顯示,參考一下吧! 敬待 careychen 大大再次指正。
------
價值的展現,來自於你用哪一個角度來看待它!! |
andyto202
一般會員 發表:10 回覆:29 積分:7 註冊:2006-12-07 發送簡訊給我 |
您的方法確實可行,不過我雖然可以將exe帶著走,不過每當我執行完exe,htm會產生出來耶(就是之前的htm檔,感覺就好像winrar的自解壓縮一樣,雖然可以自動執行,但是必須解壓縮的感覺一樣)
===================引 用 careychen 文 章=================== 不敢不敢,前輩您言重了,小弟覺得您上面的作法非常棒,小弟的回文只是依其需求回應 我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了 而小弟是比較希望發問者有空間自己去想想,不是把程式全部丟出去,讓發問者思考一下而已, 因為本篇的文其實在前一篇時有前輩已經提示了,所以希望發問者能自己再好好想一下。 ===================引 用 pceyes 文 章=================== 感謝 careychen 指正! 他的方法確實是簡單明瞭,我上面的方法也是可以用(那是為了多國語言改的),但仍不算正解, 不過我仍然堅持不要刪除的做法,用MemoryStream的方式轉成TextToWebBrowser顯示,參考一下吧! 敬待 careychen 大大再次指正。 |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
careychen 大,看了您的回文,真是受益良多,其實我也有疑問的,網上找資料,RC內容一般都是binary file如.cur , .bmp , .avi ,誏我誤以為RC沒有Text格式的,看到有Media時真是很驚呀,不知能否提供搜尋方向,看有沒有對照表,比如說 Media能容許的檔案格式有那些,我是有找到RecData可供容MP3的,真的很好玩。
我是認真過頭了,認為既然發問者要將有含帳號密碼的Html置入Exe,目的就是為了保密需要,刪除檔案再回復的軟體隨手找很多呢!帳號密碼一旦流出去就禍患無窮;最希望發問者一直往下問,感覺就像在寫專案一樣,以後要找資料的人,找到一篇可以提供許多思考方向,但又希望不要離題,真是令人難以取舍。 careychen 大,我很貪心的希望您可以再增加一篇Res含在Dll中調用的,應該還不算離題吧! ===================引 用 careychen 文 章=================== ........回文只是依其需求回應 我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了 ......是比較希望發問者有空間自己去想想,不是把程式全部丟出去,讓發問者思考一下而已, 因為本篇的文其實在前一篇時有xx已經提示了,所以希望發問者能自己再好好想一下。
------
努力會更接近成功 |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
呵,您太抬舉了,另…跟您說一個不是秘密的小秘密,就是那個 Media 也就是那個 RC_Type,其實是.... 騙人的,那個 rc 裡面其實他的語法結構是
Name Type Path 所以小弟上面的 Sample 中是用 Html1 Media D:\\ABC\\ABC.HTML 但其實 Rc 可以這樣寫 a a1 E:\\Test.rar b b1 E:\\word.doc c c1 E:\\1.txt 使用時就是 with TResourceStream.Create(HInstance, 'a', 'a1') do ...... with TResourceStream.Create(HInstance, 'b', 'b1') do ...... with TResourceStream.Create(HInstance, 'c', 'c1') do ...... 而在原本 Delphi 所定義的 RC_Type (Help 中有,請找 TResourceStream.Create) 有下面幾樣
------
價值的展現,來自於你用哪一個角度來看待它!! |
andyto202
一般會員 發表:10 回覆:29 積分:7 註冊:2006-12-07 發送簡訊給我 |
careychen兄可以順便回答我的問題嗎
為什麼htm會再執行後又跑出來呢 ===================引 用 careychen 文 章=================== 呵,您太抬舉了,另…跟您說一個不是秘密的小秘密,就是那個 Media 也就是那個 RC_Type,其實是.... 騙人的,那個 rc 裡面其實他的語法結構是 Name Type Path 所以小弟上面的 Sample 中是用 Html1 Media D:\\ABC\\ABC.HTML 但其實 Rc 可以這樣寫 a a1 E:\\Test.rar b b1 E:\\word.doc c c1 E:\\1.txt 使用時就是 with TResourceStream.Create(HInstance, 'a', 'a1') do ...... with TResourceStream.Create(HInstance, 'b', 'b1') do ...... with TResourceStream.Create(HInstance, 'c', 'c1') do ...... 而在原本 Delphi 所定義的 RC_Type (Help 中有,請找 TResourceStream.Create) 有下面幾樣 |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
andyto202先生:
請教您一個問題,我PO的兩篇#2及#4您是否都有真的用程式跑過嗎? careychen大所PO的的#3和我的#4篇又有何不同?我所PO的兩篇都可以解決你的問題,且都不會再產生Html出來,對別人已完全幫你寫完的程式,沒有測試,是很不禮貌的行為,因為這篇標題是我訂的,所以我的答案在你未提出來前就已想好了,所以絶對會切題,careychen大根本不需再回應你,他要你動腦筋,而我直接告訴你答案:你只要把我的#4減掉他的#3就是你下面要的答案了,因為你根本沒有認真看程式。 ===================引 用 andyto202 文 章=================== careychen兄可以順便回答我的問題嗎 為什麼htm會再執行後又跑出來呢
------
努力會更接近成功 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |