2017-01-03 2 views
2

C++でWindowsレジストリキーを編集するプログラムを作成していますが、ライブラリ関数RegSetValueEx()に文字列値を渡そうとすると、ファイルはTEXT()で始まります.TEXT()はハードコード値でなければなりません。私のコードのC++でRegSetValueEx()にstd :: string値を渡す方法

パーツ:

string region; 
string excelserver_type; 
string keyname = region + excelserver_type; 

if (RegSetValueEx(key64, TEXT("XXXXXXXXX"), 0, REG_SZ, (LPBYTE)TEXT("XXXXXXXXXX"), 100) != ERROR_SUCCESS) 

{ 
      RegCloseKey(key); 
      cout << "Unable to set registry value in HKEY_LOCAL_MACHINE\\Software" << endl; 
     } 

私はキー名で「XXXXXXXX」を交換してみてください、それは私にエラーを与えます。どのようにRegSetValueEx()のキー名の値を渡すのですか?

+0

どのようなエラーメッセージが表示されますか? –

答えて

3

代わりにstd::wstringタイプを使用する必要があります。これは、Windowsが文字列を内部的に格納する方法であるwchar_t型に基づいて、ワイド文字(Unicode)文字列を提供します。

次に、c_str()メンバ関数を使用して、Cスタイルの文字列へのポインタを取得し、これを直接RegSetValueEx関数に渡すことができます。 size()メンバー関数は、2つの注意点を除いて、あなたがcbDataパラメータとして渡すことができる文字列の長さを与える:

  • cbDataに文字列の長さは、終端のヌル文字が含ま期待し、あなたので、 size()によって返された長さに1を加える必要があります。
  • cbDataバイト内の文字列の大きさではなく、文字の数を予想し、そのワイド文字列のために、あなたはwchar_tの長さによってsize()によって返された値を乗算する必要があります。あなたは絶対に狭い(ANSI)文字列を使用する必要がある場合
bool SetStringValue(HKEY    hRegistryKey, 
        const std::wstring& valueName, 
        const std::wstring& data) 
{ 
    assert(hRegistryKey != nullptr); 

    return (RegSetValueExW(hRegistryKey, 
          valueName.c_str(), 
          0, 
          REG_SZ, 
          (LPBYTE)(data.c_str()), 
          (data.size() + 1) * sizeof(wchar_t)) == ERROR_SUCCESS); 
} 

、することができます(そして、あなたは、いけないあなたは、ここにオペレーティングシステムと直接インターフェースユーザー・データで作業していないため)同じことをしますが、接尾辞ARegSetValueExのANSIバージョンを明示的に呼び出してください。ここでも長さに1を加えなければなりませんが、バイト単位のサイズは文字数に等しいので、スケーリングは必要ありません。

bool SetStringValue_ANSI(HKEY    hRegistryKey, 
         const std::string& valueName, 
         const std::string& data) 
{ 
    assert(hRegistryKey != nullptr); 

    return (RegSetValueExA(hRegistryKey, 
          valueName.c_str(), 
          0, 
          REG_SZ, 
          (LPBYTE)(data.c_str()), 
          data.size() + 1) == ERROR_SUCCESS); 
} 

内部的には、RegSetValueExAは、Unicodeに文字列を変換してからRegSetValueExWと同じタスクを実行します。

+1

Ack!バイト単位のサイズを必要とする唯一のAPIの1つ。それは全く駄目だった。ありがとう@ダビッドとボー。 –

+0

これはwstring、Codyに感謝しています!! –

+0

私はC++プログラムを完成しました。私はそれを他のWindows 7コンピュータで.exeプログラムとして実行したいと思います。 C:\ Users \ Administrator \ Documents \ Visual Studio 2015 \ Projects \ ConsoleApplication1 \ x64 \ Debugのパスから.exeを他のWindows 7コンピュータにコピーしました。しかし、私が.exeを開こうとすると、 "あなたのコンピュータからMSVCP140D.dllが見つからないため、プログラムを起動できません"というエラーが表示されます。私は他のWindows 7台のコンピュータにMS Visual Studioをインストールしたくないのですが、どうすればこの問題を解決できますか? –

関連する問題