2012-10-02 198 views
0

我在將值轉換爲LPWSTR時遇到困難。我得到一個註冊表值,並試圖將結果作爲LPWSTR返回。看來使用RegQueryValueExW進行的註冊表調用適用於存儲結果的各種類型,但我無法將它們中的任何一個轉換回LPWSTR。如何將LPWSTR *(或WCHAR *)轉換爲LPWSTR

LPWSTR value; 
HKEY hKey; 

long result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"RegEntry1", 0, ACCESS|KEY_WOW64_32KEY, &hKey); 
if (result == ERROR_SUCCESS) 
{ 
    //WCHAR buffer[512]; 
    //TCHAR buffer[512]; 
    LPWSTR buffer[512]; 
    DWORD bufferSize = sizeof(buffer); 
    ULONG queryVal = 0; 

    queryVal = RegQueryValueExW(hKey, L"Path", 0, NULL, (LPBYTE)buffer, &bufferSize); 
    if (queryVal == ERROR_SUCCESS) 
    { 
     //Access violation error here; I need some type of conversion. 
     value = buffer; 
    } 
} 

到目前爲止,我在這裏讀過的沒有帖子讓我回答。 C++不是我的主要開發語言。

更新:沒有建議的答案爲我工作。我找到了一種替代方式來做我所需要的。

+2

你的緩衝區5 12個字符串(甚至沒有任何分配的內存;你只是覆蓋指針值)。 – chris

+1

在你的問題中,你說你不能投(這將在編譯時)......但在你的評論中,你說你得到一個訪問衝突(這將在運行時)。這是什麼? – dajames

+0

我可以編譯,如果我使用WCHAR,但那是當我得到訪問衝突。我無法與其他兩個編譯(除非我註釋掉「value = buffer」行)。 – Random

回答

1

你不想要一個緩衝區LPWSTR,你想要一個緩衝區wchar_t。指向它的指針將是LPWSTR,因爲它是wchar_t *的typedef。

從WINNT.H這兩條線是相關的:

typedef wchar_t WCHAR; // wc, 16-bit UNICODE character 

typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR; 

編輯:我懷疑,問題是你還沒有表現出我們的代碼的一部分。你是否從函數返回value?如果是這樣的話,問題是你正在返回一個指向已超出範圍並被銷燬的緩衝區的指針。我將返回std::wstringCString

+0

我開始使用WCHAR作爲緩衝區。由於我無法解決轉換爲LPWSTR的問題,因此我只是想盡辦法解決問題。 – Random

+0

'LPWSTR'是一個指向'WCHAR'的指針。如果你有一個「WCHAR」值的數組,那麼該數組可以原樣分配給一個「LPWSTR」,它將接收一個指向數組中第一個「WCHAR」的指針。 –

+0

@隨機檢查我的編輯。 –

2

您的buffer變量聲明一個512 wchar_t*指針的數組,當它應該聲明字符的數組時。第一個代碼註釋掉的行是正確的代碼使用方法:

WCHAR buffer[512]; 
DWORD bufferSize = sizeof(buffer); 

ULONG queryVal = RegQueryValueExW(hKey, L"Path", 0, NULL, (LPBYTE)buffer, &bufferSize); 
if (queryVal == ERROR_SUCCESS) 
{ 
    //... 
} 

請記住,緩衝區將不會是空值終止,如果註冊表鍵值不能有自己的空終止存儲,所以你另外

WCHAR buffer[512+1]; 
DWORD bufferSize = (sizeof(buffer) - sizeof(WCHAR)); 

LONG queryVal = RegQueryValueExW(hKey, L"Path", 0, NULL, (LPBYTE)buffer, &bufferSize); 
if (queryVal == ERROR_SUCCESS) 
{ 
    buffer[bufferSize/sizeof(WCHAR)] = 0; 
    //... 
} 

,使用RegGetValue()相反,它會爲你空終止:應該分配一些額外的空間,爲自己的空終止,以防萬一

WCHAR buffer[512+1]; 
DWORD bufferSize = sizeof(buffer); 

LONG queryVal = RegGetValueW(hKey, NULL, L"Path", RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ, NULL, buffer, &bufferSize); 
if (queryVal == ERROR_SUCCESS) 
{ 
    //... 
} 
+0

它在獲取註冊表值中工作,但我仍然需要將緩衝區的值轉換爲LPWSTR。 – Random

+0

由於您正在調用「RegQueryValueEx()」或「RegGetValue()」的Unicode版本,因此它已經處於'LPWSTR'格式。只需將您的填充緩衝區傳遞給期望獲得「LPWSTR」值的任何內容。 –

+0

通過從這裏收集到的信息繼續進行測試,這讓我認爲這可能是我錯誤地聲明PInvoke的方式。當我有更多的信息時會回覆。 – Random