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

是不是AnsiString不能直接放到*bBuf中...

尚未結案
khlin
一般會員


發表:9
回覆:22
積分:6
註冊:2003-03-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-25 09:24:58 IP:192.192.xxx.xxx 未訂閱
請教各位前輩,以下程式在第三行出現錯誤... 是不是AnsiString不能直接放到*bBuf中... 有什麼方法嗎? AnsiString Value; BYTE *bBuf=new BYTE[1000]; *bBuf=(char*)Value; //錯誤
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-25 09:55:51 IP:211.21.xxx.xxx 未訂閱
引言: 請教各位前輩,以下程式在第三行出現錯誤... 是不是AnsiString不能直接放到*bBuf中... 有什麼方法嗎? AnsiString Value; BYTE *bBuf=new BYTE[1000]; *bBuf=(char*)Value; //錯誤
AnsiString 裡有個 c_str() (或是類似名稱) 的 method 可以傳出 const char * 再用 strcpy 複製至您要的 buffer
khlin
一般會員


發表:9
回覆:22
積分:6
註冊:2003-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-25 10:37:54 IP:192.192.xxx.xxx 未訂閱
對不起,利用strcpy傳入的值是不同的........不知道為什麼? 如下: VN是一Registry中REG_MULTI_SZ型態的項目名稱, Path是其路徑,而我要將Value中的值寫到VN中,可是寫入後到Registry看是亂碼...為什麼呢? AnsiString VN="DefaultGateway"; AnsiString Path="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameteters\\Interfaces\\DBA8AA83-2D02-4B23-8CE1-CEF96913418D}"; AnsiString Value="192.168.192.1"; curReg->RootKey=HKEY_LOCAL_MACHINE; curReg->OpenKey(Path,false); DWORD dwBuf=curReg->GetDataSize(VN); BYTE *bBuf=new BYTE[dwBuf]; strcpy( bBuf, Value.c_str() ); curReg->WriteBinaryData(VN, bBuf, dwBuf);
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-25 11:36:14 IP:211.21.xxx.xxx 未訂閱
引言: 對不起,利用strcpy傳入的值是不同的........不知道為什麼? 如下: VN是一Registry中REG_MULTI_SZ型態的項目名稱, Path是其路徑,而我要將Value中的值寫到VN中,可是寫入後到Registry看是亂碼...為什麼呢? AnsiString VN="DefaultGateway"; AnsiString Path="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameteters\\Interfaces\\DBA8AA83-2D02-4B23-8CE1-CEF96913418D}"; AnsiString Value="192.168.192.1"; curReg->RootKey=HKEY_LOCAL_MACHINE; curReg->OpenKey(Path,false); DWORD dwBuf=curReg->GetDataSize(VN); BYTE *bBuf=new BYTE[dwBuf]; strcpy( bBuf, Value.c_str() ); curReg->WriteBinaryData(VN, bBuf, dwBuf);
我現在手邊沒 BCB,沒法幫您查 VCL 的 registry class method 不過應該在紅色的地方沒錯(您可以設中斷去觀察一下) 錯是錯在您要寫入的是 SZ 的 type,卻用 binary 的 method 去寫 應該是有另一個 method 是寫入 sz type 的 且那個 method 應該是可以吃 AnsiString 的參數。 發表人 - brant 於 2003/04/25 11:37:30
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-25 21:56:04 IP:211.75.xxx.xxx 未訂閱
khlin 你好,   這裡關係到幾個問題: (1)    Path 所指定的 Key 與 Value 等值是否已經存在 registry 中呢? (2)   如果沒有, 你就得按部就班檢查 OpenKey() 與 GetDataSize() 等   程式執行的回傳值  以判斷是否正確運作, 從 registry 中讀取資料   前應先判斷 資料是否存在?    Sample Code 如下: AnsiString VN="DefaultGateway"; AnsiString Path="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameteters\\Interfaces\\DBA8AA83-2D02-4B23-8CE1-CEF96913418D}";    AnsiString Value="192.168.192.1";    TRegistry* curReg = new TRegistry; curReg->RootKey=HKEY_LOCAL_MACHINE; bool bRet1 = curReg->KeyExists(Path); bool bCreateKey = !bRet1; bool bRet2 = curReg->OpenKey(Path,bCreateKey); bool bRet3 = curReg->ValueExists(VN); DWORD dwBuf = 512; // 預設大小 if (bRet3) dwBuf=curReg->GetDataSize(VN); BYTE *bBuf=new BYTE[dwBuf]; strcpy( bBuf, Value.c_str() ); curReg->WriteBinaryData(VN, bBuf, dwBuf); delete curReg;    (3)   你說資料是亂碼嗎? 他是二進位顯示的, 因為你使用 WriteBinaryData函數   如果你要以字串顯示的話 就得用 WriteString   *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-25 22:02:21 IP:61.219.xxx.xxx 未訂閱
引言:
引言: 對不起,利用strcpy傳入的值是不同的........不知道為什麼? 如下: VN是一Registry中REG_MULTI_SZ型態的項目名稱, Path是其路徑,而我要將Value中的值寫到VN中,可是寫入後到Registry看是亂碼...為什麼呢? AnsiString VN="DefaultGateway"; AnsiString Path="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameteters\\Interfaces\\DBA8AA83-2D02-4B23-8CE1-CEF96913418D}"; AnsiString Value="192.168.192.1"; curReg->RootKey=HKEY_LOCAL_MACHINE; curReg->OpenKey(Path,false); DWORD dwBuf=curReg->GetDataSize(VN); BYTE *bBuf=new BYTE[dwBuf]; strcpy( bBuf, Value.c_str() ); curReg->WriteBinaryData(VN, bBuf, dwBuf);
我現在手邊沒 BCB,沒法幫您查 VCL 的 registry class method 不過應該在紅色的地方沒錯(您可以設中斷去觀察一下) 錯是錯在您要寫入的是 SZ 的 type,卻用 binary 的 method 去寫 應該是有另一個 method 是寫入 sz type 的 且那個 method 應該是可以吃 AnsiString 的參數。 發表人 - brant 於 2003/04/25 11:37:30
回到家幫您查了, 應該要用 WriteString 這個 method 去寫
khlin
一般會員


發表:9
回覆:22
積分:6
註冊:2003-03-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-28 09:41:02 IP:192.192.xxx.xxx 未訂閱
兩位前輩您好, 我用WriteString的方法...結果發現原本為REG_MULTI_SZ型態卻被改為REG_SZ了...所以該值也失去了功用..... ??
khlin
一般會員


發表:9
回覆:22
積分:6
註冊:2003-03-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-28 09:50:48 IP:192.192.xxx.xxx 未訂閱
我剛又用WriteBinaryData的方法再試一次...結果發現原本為REG_MULTI_SZ型態卻被改為REG_Binary了... 所以我想請教各位高手...到底讀寫Registry中REG_MULTI_SZ要用什麼比較好....
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-28 11:04:21 IP:203.73.xxx.xxx 未訂閱
引言: 我剛又用WriteBinaryData的方法再試一次...結果發現原本為REG_MULTI_SZ型態卻被改為REG_Binary了... 所以我想請教各位高手...到底讀寫Registry中REG_MULTI_SZ要用什麼比較好....
khlin 你好: 我寫了一段範例程式碼,你先試試看可不可以用< > 如果可以使用的話,請再依照你個人的需求做修改< >
   HKEY hKey=NULL;
   DWORD dwDisposition=0;
   AnsiString Path="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\{3243FEBC-7AB8-4612-AA21-FBF3B06F8611}";
   RegCreateKeyEx(HKEY_LOCAL_MACHINE, Path.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE,
      KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
   AnsiString VN="DefaultGateway1";
   AnsiString Value="192.168.192.1";
   DWORD dwBuf=Value.Length() 2;
   BYTE *bBuf=new BYTE[dwBuf];
   ZeroMemory(bBuf, dwBuf);
   CopyMemory(bBuf, Value.c_str(), Value.Length());
   RegSetValueEx(hKey, VN.c_str(), NULL, REG_MULTI_SZ, bBuf, dwBuf);
   RegCloseKey(hKey);
備註: 以上的方式是使用 Win32 API RegCreateKeyEx, RegSetValueEx.... 詳細的使用方式,建議你應該自己查詢 M$DN 中的說明 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-28 15:42:04 IP:211.21.xxx.xxx 未訂閱
對呀,我那天在看,也是沒看到寫 multi_sz 的 method 這應該是VCL不完整吧? 還是在 TRegistry 裡有別的方法可以寫入或讀出 multi_sz? ps.我會用API,只是想知道VCL的做法~
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-29 11:57:38 IP:61.216.xxx.xxx 未訂閱
dear all,   剛剛 我看了 MSDN 下 REG_MUL_SZ 的一些說明, 茲節錄如下: REG_MULTI_SZ  Array of null-terminated strings that are terminated by two null characters. 因此, 在 BCB 中, 是呼叫 WriteBinaryData 來寫入資料地.... 那麼問題出現在哪裡呢? 就在上面的解釋中了, 經我悟得如: 待寫入字串有二, > > <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
khlin
一般會員


發表:9
回覆:22
積分:6
註冊:2003-03-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-30 14:12:25 IP:192.192.xxx.xxx 未訂閱
謝謝各位的指導,因為Royce520的方法比較符合小弟需要.所以把分數給了他! 再次謝謝各位!
系統時間:2024-04-20 1:04:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!