1

値を LPWSTR に変換するのが困難です。レジストリ値を取得し、その結果を LPWSTR として返そうとしています。RegQueryValueExW を使用したレジストリ呼び出しは、結果を格納するためにさまざまな型で動作するようですが、それらのいずれも 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++ は私の主要な開発言語ではありません。

更新: 提案された回答はどれもうまくいきませんでした。必要なことを行う別の方法を見つけました。

4

2 に答える 2

2

変数は、代わりに 512 文字の配列を宣言する必要があるときにbuffer、512 ポインターの配列を宣言しています。コメントアウトされたコードの最初の行は、使用する正しいコードです。wchar_t*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;
    //...
} 

または、null ターミネータを処理する代わりに使用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) 
{  
    //...
} 
于 2012-10-02T17:40:33.483 に答える
2

のバッファは必要ありません。LPWSTRのバッファが必要ですwchar_t。それへのポインターはLPWSTR、のtypedefであるためwchar_t *です。

WinNT.h の次の 2 行が関連しています。

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

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

編集:問題は、表示されていないコードの部分にあると思われます。関数から戻っvalueていますか?その場合、問題は、スコープ外になり破棄されたバッファーへのポインターを返していることです。std::wstring代わりにorを返しCStringます。

于 2012-10-02T17:29:10.397 に答える