變數形態是陣列的問題? |
答題得分者是:jow
|
ry_lee
高階會員 ![]() ![]() ![]() ![]() 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
var buf:array[0..255] of byte;
sysdir:string; i,len:integer; begin len:=GetSystemDirectory(@buf, sizeof(buf)); for i:=0 to len-1 do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir'); end; 以上程式碼執行ok ---------------------------------------------------- var buf:array of byte; sysdir:string; i,max_path,len:Cardinal; begin max_path:=300; len:=GetSystemDirectory(@buf, max_path); for i := Low(Buf) to High(Buf) do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir); end; 以上程式碼執行錯誤, 即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤 ps:我的delphi是7.0版. |
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
hi,我看一下,應該是變動陣列的關係,在 GetSystemDirectory 他本身要傳入的是 PAnsichar
但,當你是使用 array[0..255] of byte 時 其實可以看成是 array[0..255] of char 所以你傳入 Windows 的函式,他是可以處理的,你可以使用 sizeof(buf) 看一下,這時候是 256 但你用 array of byte 時,不等於 pChar !! 而且你這種寫法是 c 的寫法,在 delphi 用 delphi 的方式就好了 可以建議你用下面這樣簡單的方式就可以了 var tmpChar: PChar; begin tmpChar := StrAlloc(Max_Path); // Max_Path 是 Windows 這個 Unit 裡就有宣告了,不用自己再宣告!! GetSystemDirectory(tmpChar, Max_Path); showmessage('sys dir =' tmpChar); StrDispose(tmpChar); end; ===================引 用 ry_lee 文 章=================== var buf:array[0..255] of byte; sysdir:string; i,len:integer; begin len:=GetSystemDirectory(@buf, sizeof(buf)); for i:=0 to len-1 do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir'); end; 以上程式碼執行ok ---------------------------------------------------- var buf:array of byte; sysdir:string; i,max_path,len:Cardinal; begin max_path:=300; len:=GetSystemDirectory(@buf, max_path); for i := Low(Buf) to High(Buf) do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir); end; 以上程式碼執行錯誤, 即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤 ps:我的delphi是7.0版.
------
價值的展現,來自於你用哪一個角度來看待它!! |
syntax
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
其實這跟是否為 PChar 沒多大關係,不過就是傳入一個 Memory Buffer ,管他是不是 PChar 還是 Byte Array
主要會錯,是因為[你忘記做記憶體空間宣告拉] Setlength for delphi array StrAlloc, memalloc, new ... etc. for PChar or a memory block ===================引 用 ry_lee 文 章=================== var buf:array[0..255] of byte; sysdir:string; i,len:integer; begin len:=GetSystemDirectory(@buf, sizeof(buf)); for i:=0 to len-1 do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir'); end; 以上程式碼執行ok ---------------------------------------------------- var buf:array of byte; sysdir:string; i,max_path,len:Cardinal; begin max_path:=300; len:=GetSystemDirectory(@buf, max_path); for i := Low(Buf) to High(Buf) do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir); end; 以上程式碼執行錯誤, 即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤 ps:我的delphi是7.0版. |
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
Syntax 大,不好意思,關於這個小弟也很好奇~~,如何用動態的 Arrary 能放入 GetSystemDirectory 呢?
因為我 SetLength 也是錯,我好像沒辦法使用【動態陣列傳入】,但設靜態的可以,請問該如何寫呢? 謝謝! ===================引 用 syntax 文 章=================== 其實這跟是否為 PChar 沒多大關係,不過就是傳入一個 Memory Buffer ,管他是不是 PChar 還是 Byte Array 主要會錯,是因為[你忘記做記憶體空間宣告拉] Setlength for delphi array StrAlloc, memalloc, new ... etc. for PChar or a memory block ===================引 用 ry_lee 文 章=================== var buf:array[0..255] of byte; sysdir:string; i,len:integer; begin len:=GetSystemDirectory(@buf, sizeof(buf)); for i:=0 to len-1 do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir'); end; 以上程式碼執行ok ---------------------------------------------------- var buf:array of byte; sysdir:string; i,max_path,len:Cardinal; begin max_path:=300; len:=GetSystemDirectory(@buf, max_path); for i := Low(Buf) to High(Buf) do sysdir:=sysdir chr(buf[i]); showmessage('sys dir =' sysdir); end; 以上程式碼執行錯誤, 即使將 for i := Low(Buf) to High(Buf) do改為for i:=0 to len-1 do也是一樣錯誤,請問該怎麼改寫才不會執行錯誤 ps:我的delphi是7.0版.
------
價值的展現,來自於你用哪一個角度來看待它!! |
pceyes
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
參考這篇改的
Win32 API 使用討論區(Delphi) » GetSystemDirectoryA 使用問題 http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=42443 char; sysdir:string; i,max_path,len:Cardinal; begin pchar(buf), SetLength(buf,Len); for i := Low(Buf) to High(Buf) do sysdir:=sysdir buf[i]; showmessage('sys dir =' sysdir); end;
------
努力會更接近成功 |
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
chih_kuan
中階會員 ![]() ![]() ![]() 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
jow
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
來插一腳
![]() [code delphi] var buf: array of Byte; sysdir: string; max_path,len: Cardinal; begin max_path := 300; SetLength(buf,max_path); try len := GetSystemDirectory(PChar(buf), max_path); if len > 0 then begin sysdir := PChar(@buf[0]); ShowMessage('sys dir =' sysdir); end; finally buf := nil; end; end; [/code] [code delphi] var sysdir: string; max_path,len: Cardinal; begin max_path := 300; SetLength(sysdir,max_path); try len := GetSystemDirectory(PChar(sysdir), max_path); if len > 0 then begin SetLength(sysdir,len); ShowMessage('sys dir =' sysdir); end; finally SetLength(sysdir,0); end; end; [/code] 其實指標的使用, 萬變不離其中, 順手就好.... ![]()
編輯記錄
jow 重新編輯於 2008-10-06 15:22:28, 註解 無‧
|
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
呵呵~~~~,非常感謝各位大大,發問者不是我,我卻問最多問題,感謝感謝
現在了解 array of byte 怎麼使用了,感恩感恩~~! ===================引 用 jow 文 章=================== 來插一腳 ![]() [code delphi] var buf: array of Byte; sysdir: string; max_path,len: Cardinal; begin max_path := 300; SetLength(buf,max_path); try len := GetSystemDirectory(PChar(buf), max_path); if len > 0 then begin sysdir := PChar(@buf[0]); ShowMessage('sys dir =' sysdir); end; finally buf := nil; end; end; [/code] [code delphi] var sysdir: string; max_path,len: Cardinal; begin max_path := 300; SetLength(sysdir,max_path); try len := GetSystemDirectory(PChar(sysdir), max_path); if len > 0 then begin SetLength(sysdir,len); ShowMessage('sys dir =' sysdir); end; finally SetLength(sysdir,0); end; end; [/code] 其實指標的使用, 萬變不離其中, 順手就好.... ![]()
------
價值的展現,來自於你用哪一個角度來看待它!! |
roviury
一般會員 ![]() ![]() 發表:3 回覆:49 積分:15 註冊:2008-08-28 發送簡訊給我 |
動態的意思,不是你要多少就要多少
只是讓你隨意分配 這要你學過你東西,你就會明白 var p:pointer; getmem(p,256); 這樣就能分配到p為一個array[0..255] of byte的陣列 不相信? var buf:pointer; sysdir:string; i,len:integer; begin getmem(buf,256); len:=GetSystemDirectory(buf, 256); sysdir:=string(pchar(buf)); showmessage('sys dir =' sysdir); end; 這麼恐怖,delphi是不知道buf變得這麼恐怖 所以最後要加回 freemem(buf,256) 各自有不同的方法,但我想告訴你知道,api是根據c而寫的,所以我們也不要浪費一個好好的type pchar 不但快,而且短 GetSystemDirectory必定在最後加入#0,這也是pchar比string好的地方 Var k : PChar; begin k := AllocMem(256); GetSystemDirectory(k,256); Showmessage(k); FreeMem(k,256); end; 一般來說,256必定夠用,如果你的GetSystemDirectory能夠超過256,那麼....找ms公司吧.. delphi提供了一個好方法把pchar轉回string,那就是... string:=pchar (....逃)
編輯記錄
roviury 重新編輯於 2009-05-11 19:31:44, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |