2012-04-14 12 views
5

これは主にWinAPI RegSetValueExに関する質問です。 MSDN hereの説明を見ると、Windowsレジストリ内の文字列のスラッシュをエスケープする必要はありますか?

lpData [in]格納されるデータです。

REG_SZの場合、文字列はNULLで終了する必要があります。 REG_MULTI_SZデータ タイプの場合、文字列は2つのヌル文字で終了する必要があります。 バックスラッシュの前に、エスケープ 文字として別​​のバックスラッシュを付ける必要があります。たとえば、 "C:¥¥mydir¥¥myfile"と指定すると、 という文字列 "C:¥mydir¥myfile"が格納されます。

私は本当にスラッシュをエスケープする必要がありますか?私は以前にそれをやったことがないので、それは完璧にうまくいった。

+0

エスケープはC++であり、メソッドではありません。たとえば、コマンドラインからユーザー入力を取り止めようとしている場合、\をすべての\に含めるようにテキストを変換する必要はありません。しかし、 "C:\ ..."のようなコードで文字列リテラルを使用する場合は、C++ソースに "C:\\ ..."が必要です。私はこれがドキュメントが話しているものと仮定しています。あなたが実際に "C:\\\\ ..."を行う必要があることを意味するチャンスがあります(この場合、ユーザ入力を変換する必要があります)。 – Corbin

+0

@Corbin :)それは大きな違いをもたらします。彼らがドキュメントにどのように記述しているかは非常に混乱しています。 – ahmd0

+0

良い質問ですが、この文書は本当に奇妙です –

答えて

8

これは実際にはドキュメントエラーです。ここではバックスラッシュをエスケープする必要はありません。このAPIに送信する正確な文字列は、レジストリに格納される文字列です。バックスラッシュの処理は行われません。

CやC++では、文字列リテラルで特定の文字をエスケープする必要がありますが、これはWin32 APIのドキュメントには関係ありません。これは、特定の言語のオブジェクトコード変換に対するソースコードの問題であり、この文書の送付をはるかに超えています。

+0

確かに。キーパーツは*文字列リテラル*のバックスラッシュ文字をエスケープします。 –

2

はい、\はC++で意味があるため、\\は通常のバックスラッシュを意味します。

\が文字列に現れると、C++コンパイラは次の文字を調べて何かに変換します(たとえば\nは "改行"文字に変換されます)。 \\は通常のバックスラッシュに変換されます。これは「エスケープ」と呼ばれています(歴史的に古い端末では、ESC +キーの組み合わせがキーボードにない多くのキーに使用されていました)。

+0

これはC + +ではありません。私はRegSetValueEx APIに渡される値について話しています。 – ahmd0

+0

@ ahmd0あなたはあなたの質問にC++でタグを付けました。あなたは今どの言語を使っていますか? – littleadv

+2

はい、C++。もちろん、私はCでスラッシュを使って物事を逃れる必要があることを知っています.Windows APIの説明には、C++や他の言語とは関係がありません。ここでも、MSがレジストリAPIに渡される文字列をエスケープしてほしいかどうかを知りたい。 – ahmd0

関連する問題