3

このMSDNの記事は、サブキーを持つレジストリキーを削除する方法を示すことになっていますが、コードに欠陥があります。

言う行

StringCchCopy (lpEnd, MAX_PATH*2, szName);

lpEndのバッファを超えてコピーしようとしたために例外が発生します。その行を次のように置き換えて、ソリューションを修正してみました

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の記事が間違っているのはイライラします...あなたはそれらがチェックされると思うでしょう。

これを修正する方法について何かアイデアはありますか?

ありがとう。

4

2 に答える 2

1

その変更だけでは十分ではありません。その後のコード行:

        if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
            break;

また、変更する必要があります。 完全なキーが含まれているため、lpSubKeyに置き換える必要があります。buf

言うまでもありませんがbuf、クリーンアップの一環として必ず解放(削除)してください。

ただし、正確を期すために、コードの元の行を変更して正しい長さを渡すように修正する方がよいようです(レジストリの最大キー長は255であると私は信じているので、これで問題ありません)

StringCchCopy (lpEnd, MAX_PATH*2 - lstrlen(lpSubKey), szName);
于 2012-04-25T12:35:40.963 に答える
1

追加の依存関係として気にしない場合は、 SHDeleteKeyShlwapi.dllを使用する方が簡単な場合があります。Vista +のみを対象としている場合は、RegDeleteTree(にある)が別の方法です。Advapi32.dll

于 2012-04-25T13:11:17.483 に答える