線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2396
推到 Plurk!
推到 Facebook!

String 轉 PChar

尚未結案
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-03 12:00:41 IP:211.22.xxx.xxx 未訂閱
我寫了一個函式,有用到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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-03 12:09:25 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-03 12:11:02 IP:147.8.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-03 12:22:04 IP:211.76.xxx.xxx 未訂閱
要傳入 API 中的 string, 由於已於有配置記憶體了, 可以直接用 PChar( XXX ) 的方式來轉換即可!! 而不是 PChar( XXX )^ !! 所以使用 CreateFile(PChar(FileName) ,GENERIC_READ,0,nil,OPEN_EXISTING,0,0); 即可!!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-03 12:37:59 IP:61.218.xxx.xxx 未訂閱
// String 轉 Pchar p:=Pchar(s);    //Pchar 轉成 string s:=StrPas(p);    僅供參考,歡迎繼續發言
------
︿︿
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-03 13:08:51 IP:61.70.xxx.xxx 未訂閱
看來有經有人回答的很好了 ! 不過沒有人提到為什麼 ! 所以在此現醜了 所謂的 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-03 13:32:19 IP:211.22.xxx.xxx 未訂閱
非常感謝各位高手仗義相助! 小弟還有一點疑問,如果使用StrAlloc() 函式 釋放記憶體的函式,是不是用 FreeMem() 呢?
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-03 13:36:24 IP:61.218.xxx.xxx 未訂閱
//取得 p:=StrAlloc(100); //釋放 StrDispose(p);    僅供參考,歡迎繼續發言
------
︿︿
系統時間:2024-05-03 21:58:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!