2012-04-25 9 views
3

This MSDNの記事では、サブキーを持つレジストリキーを削除する方法を示していますが、コードには欠陥があります。レジストリキーを削除する - MSDNサンプルでエラーが発生する

StringCchCopy (lpEnd, MAX_PATH*2, szName); 

言う

ラインはlpEndのバッファを超えてにコピーしようとしているためです例外を引き起こします。私は、ターゲットプラットフォームとのdevのプラットフォームとしてコードをステップすることができませんでしだ次

size_t subKeyLen = lstrlen(lpSubKey); 
size_t bufLen = subKeyLen + lstrlen(szName)+1; 
LPTSTR buf = new WCHAR[bufLen]; 
StringCchCopy(buf,bufLen,lpSubKey); 
StringCchCopy(buf+subKeyLen,lstrlen(szName)+1,szName); 
buf[bufLen-1]='\0'; 

でその行を置き換えることにより、ソリューションを修正しようとした異なっているが、伐採から、私はコードそれに入れていますそれはちょうどフリーズアップのように見えますが、例外はスローされません。

MSDNの記事が間違っているのは残念です...彼らはチェックされると思います。

これを修正する方法はありますか?

ありがとうございました。

+1

はい、サンプルのバグです。 'StringCchCopy(lpEnd、MAX_PATH * 2 - (lpEnd - lpSubKey)、szName)'でなければなりません。またはこれまでより単純な 'lpEnd = 0; StringCchCat(lpSubKey、MAX_PATH * 2、szName) 'となります。 –

答えて

1

追加の依存関係としてShlwapi.dllを持つ気にしない場合は、あなただけSHDeleteKeyを使用するために、それは簡単かもしれません。 Vista +のみをターゲットにしている場合はRegDeleteTreeAdvapi32.dllに住んでいます)の別の方法もあります。

+0

申し訳ありません私はすでにこれを解決済みとマークしていますが、私は問題にぶつかりました。これをHKEY_CURRENT_USERで作成したキーでテストするとうまくいきましたが、HKEY_LOCAL_MACHINEでキーを削除しようとすると効果はありません。 –

+1

@BillWaltonおそらく、HKEY_LOCAL_MACHINEの何かを変更する権限がありません。これが絶対に必要なものであれば、昇格した特権で実行する必要があります。 –

+1

HKEY_LOCAL_MACHINEを変更する権限がありますか?あなたは管理者として実行する必要があります –

1

それだけでは十分ではありません。それに続くコード行:

も変更する必要があります。 lpSubKeyは完全キーが含まれているので、bufに置き換える必要があります。

そしておそらく言うことですが、クリーンアップの一部としてbufを無料(削除)してください。

しかし、正確な長さを渡すためにコードの元の行を修正するだけで良いのではないかと思われます(でなければなりません) 255)は次のとおりです。

StringCchCopy (lpEnd, MAX_PATH*2 - lstrlen(lpSubKey), szName); 
関連する問題