String 轉 PChar |
尚未結案
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
我寫了一個函式,有用到String 轉 PChar,因為不熟悉,想問一下大家都是如何處理的?
我查了論壇及Help,找到了兩個方式:
1.使用 StrPCopy 函式,例如 StrPCopy(sFileName, FileName);
CreateFile(sFileName,GENERIC_READ,0,nil,OPEN_EXISTING,0,0);卻出現[Warning]: Variable 'sFileName' might not have been initialized
於是我在程式裡加了,GetMem(sFileName, MAX_PATH); 的處理
2.直接轉型,例如PChar(FileName)^
CreateFile(PChar(FileName)^ ,GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
卻出現[Error] : Incompatible types: 'Char' and 'PChar'
我的程式如下:
procedure THexEditor.LoadFromHandle(const FileName: string); var hHandle: THandle; sFileName: PChar; begin GetMem(sFileName, MAX_PATH); StrPCopy(sFileName, FileName); hHandle := CreateFile(sFileName,GENERIC_READ,0,nil,0,0,0); if hHandle = INVALID_HANDLE_VALUE then raise EFOpenError.CreateFmt(ERR_FILE_OPEN_FAILED, [FileName]); FreeMem(sFileName); end; |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
procedure THexEditor.LoadFromHandle(const FileName: string);
var hHandle: THandle;
sFileName: PChar;
begin
sFileName:=Pchar(FileName);
hHandle := CreateFile(sFileName,GENERIC_READ,0,nil,0,0,0); if hHandle = INVALID_HANDLE_VALUE then
raise EFOpenError.CreateFmt(ERR_FILE_OPEN_FAILED, [FileName]);
end;
------
︿︿ |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
procedure THexEditor.LoadFromHandle(const FileName: string); var hHandle: THandle; begin hHandle := CreateFile(PChar(FileName),GENERIC_READ,0,nil,0,0,0); if hHandle = INVALID_HANDLE_VALUE then raise EFOpenError.CreateFmt(ERR_FILE_OPEN_FAILED, [FileName]); end; |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
看來有經有人回答的很好了 !
不過沒有人提到為什麼 ! 所以在此現醜了 所謂的 PChar 是指 Char 格式的 Pointer
我們可以將之看成連續的 Char 形成一個 String
只是 PChar 是指向那個字串開頭記憶體位址的 Pointer
而 Delphi 的 String 其實是一個指向儲存字串記憶體位址的位置的 Pointer
一個是記憶體位址的開端 一個是指向儲存字串記憶體位址開端
所以需要一次轉換
若X: String ;Y: PChar
所以是 Y := PChar(X)
Y := @X[1]
Y := @PChar(X)^
可以知道以下的值是相等的
Y^ = X[1] Y = @X[1]
因此 PChar(X)^ 是等於 X[1] (先將X位址化,在取出參考之結果值) 在 Deplhi 對於動態記憶體之技術,其實是使用二次參考,也因此參數傳遞或呼叫有用到位址方面的時候。如果你用的是動態的陣列或是 String 則適用
Dynamic_Array[0] 或 String[1] ,而不是 Dynamic_Array , String ,不然參考到的只是一個指向實際記憶體開頭位址的位置而已,這就是 Pascal 與 C 的記憶體技術在編譯器時期的不同,至於編成目的碼後其實都是一樣的。
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |