2012-09-07 28 views
0

現在我搜索了兩個小時,並且找不到我的問題的答案:我需要獲得註冊表REG_SZ值並將其傳遞給char*C++字符轉換

char host_val[1024]; 
DWORD hostVal_size = 1024; 
char* hostName; 
DWORD dwType = REG_SZ; 

RegOpenKeyEx(//no problem here); 
if(RegQueryValueEx(hKey, TEXT("HostName"), 0, &dwType, (LPBYTE)&host_val, &hostVal_size) == ERROR_SUCCESS) 
{ 
     //hostName = host_val; 
} 

我該怎麼做這個轉換hostName = host_val

+0

究竟是什麼問題?將固定長度的char數組轉換爲char *? – SingerOfTheFall

+0

@SingerOfTheFall,是的,轉換是我的問題。 – MRM

回答

2

如果您使用Unicode進行編譯,則需要將Unicode字符串(可能未終止)複製到窄字符緩衝區中。 unicode字符串中的第一個字符將爲0x3100(說明您的計算機上的字節序,這可能是小端,並且您說IP地址的事實是192 ....)

將值填入char []數組將以單字符空終止的字符串形式報告。你有兩個選擇。

  1. 使用函數RegQueryValueExA,一切保持不變,或
  2. 你的char []數組更改爲wchar_t的[]數組,你現在正在做什麼,然後轉換爲使用調用WideCharToMultiByte縮小(文檔是在SDK)。

由於顯而易見的原因,我會選擇這兩個選項中的前者。

+0

如果我使用'RegQueryValueExA'我得到一個'錯誤C2664:'RegQueryValueExA':不能將參數2從'const wchar_t [9]'轉換爲'LPCSTR'' – MRM

+0

Take出來TEXT()宏包裝器,爲您的字符串文字在該調用。 – WhozCraig

+0

工作過,謝謝! – MRM

4

產生的host_valpossibly non-null-terminated string(請參閱「備註」),所以你應該把它與memcpy複製到新分配的字符串,並確保它是空值終止:

hostName = new char[hostVal_size + 1]; 
// host_val may or may not be null-terminated 
memcpy(hostName, host_val, hostVal_size); 
hostName[hostVal_size] = '\0'; 

您需要delete[]的之後的hostName

+0

我註冊表中的值是一個IP地址,例如'192.168.1.219'。使用'RegQueryValueEx'將該值傳遞給'host_val',但在使用代碼後,所有複製到'hostName'的內容都是'1'。 – MRM

+0

然後你得到大小錯誤...... – Macke

3

使用功能

RegQueryValueExA 

這樣你就不需要轉換的ANSI版本。