是不是AnsiString不能直接放到*bBuf中... |
尚未結案
|
khlin
一般會員 發表:9 回覆:22 積分:6 註冊:2003-03-31 發送簡訊給我 |
|
brant
一般會員 發表:1 回覆:64 積分:23 註冊:2003-04-07 發送簡訊給我 |
|
khlin
一般會員 發表:9 回覆:22 積分:6 註冊:2003-03-31 發送簡訊給我 |
對不起,利用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 發送簡訊給我 |
引言: 對不起,利用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 發送簡訊給我 |
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 發送簡訊給我 |
引言:回到家幫您查了, 應該要用 WriteString 這個 method 去寫引言: 對不起,利用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 |
khlin
一般會員 發表:9 回覆:22 積分:6 註冊:2003-03-31 發送簡訊給我 |
|
khlin
一般會員 發表:9 回覆:22 積分:6 註冊:2003-03-31 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我剛又用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 發送簡訊給我 |
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |