ソースメモ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/12/10(月) 00:01:21最終的には“HKEY_LOCAL_MACHINE”と“HKEY_USERS”のキーを検索し、 空文字列の標準を削除できるようにしたい
-----
#include "Shlwapi.h"
#include "Windows.h"
#define Sprintf sprintf
#pragma comment(lib, "shlwapi.lib")
char localbuffer[256];
char title[] = "空文字列の標準(既定)の検索と削除";
unsigned int Success = 0, Failure = 0;
void DelNullValue(HKEY handle);
void DelNullValue2(HKEY handle, char *subkey);
0002デフォルトの名無しさん
2007/12/10(月) 00:02:43{
if(!CreateMutex(NULL, 1, "DelNullValue")) {
MessageBox(NULL, "ミューテックスオブジェクトの作成に失敗しました。", title, MB_ICONSTOP);
return 1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS) {
MessageBox(NULL, "DelNullValue.exe は既に起動しております。", title, MB_ICONSTOP);
return 1;
}
if(MessageBox(NULL, "レジストリから空っぽの標準(既存)を検索し、 削除します。\n\nこのプログラムを実行しますか", title, MB_YESNO) == IDYES) {
DelNullValue(HKEY_CLASSES_ROOT);
DelNullValue(HKEY_CURRENT_USER);
DelNullValue(HKEY_LOCAL_MACHINE);
DelNullValue2(HKEY_CLASSES_ROOT, "ClsID");
DelNullValue2(HKEY_CLASSES_ROOT, "TypeLib");
Sprintf(localbuffer, "削除成功 : %u\n削除失敗 : %u", Success, Failure);
MessageBox(NULL, localbuffer, title, MB_ICONINFORMATION);
}
return 0;
}
0003デフォルトの名無しさん
2007/12/10(月) 00:03:46HKEY handle2;
DWORD i, n, type, size;
RegQueryInfoKey(handle, NULL, NULL, NULL, &n, NULL, NULL, NULL, NULL, NULL, NULL, NULL); //キーの数を取得
for(i = 0; i != n;) {
RegEnumKey(handle, i++, localbuffer, sizeof localbuffer); //キーを検挙
RegOpenKeyEx(handle, localbuffer, NULL, KEY_QUERY_VALUE | KEY_SET_VALUE, &handle2);
if(RegQueryValueEx(handle2, NULL, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
if(size == 1 && type == REG_SZ || type == REG_EXPAND_SZ) {
if(RegDeleteValue(handle2, NULL) == ERROR_SUCCESS) Success++; else Failure++;
}
}
RegCloseKey(handle2);
}
}
0004デフォルトの名無しさん
2007/12/10(月) 00:04:43HKEY t_handle;
RegOpenKeyEx(handle, subkey, NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &t_handle);
DelNullValue(t_handle);
RegCloseKey(t_handle);
}
0005デフォルトの名無しさん
2007/12/10(月) 01:34:30. 〃 ヽル1'´ ∠:::::::::::::::::i
i′ ___, - ,. = -一  ̄l:::::::::::::::l
. ! , -==、´r' l::::::/,ニ.ヽ
l _,, -‐''二ゝ l::::l f゙ヽ |、 ここはお前のメモ帳じゃねえんだ
レー-- 、ヽヾニ-ァ,ニ;=、_ !:::l ) } ト
ヾ¨'7"ry、` ー゙='ニ,,,` }::ヽ(ノ チラシの裏にでも書いてろ
:ーゝヽ、 !´ " ̄ 'l,;;;;,,,.、 ,i:::::::ミ
::::::::::::::::ヽ.-‐ ト、 r'_{ __)`ニゝ、 ,,iリ::::::::ミ
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ , な!
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::///
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
0006デフォルトの名無しさん
2007/12/10(月) 19:02:430007デフォルトの名無しさん
2007/12/15(土) 20:35:21一週間たたないうたに消えると思っていたが
>>1
#pragma comment(lib, "shlwapi.lib") は不要
>>6
余計なお世話だ。
そこまでいうなら見本でも書いて見ろよ。
>>5よりましか。
0008デフォルトの名無しさん
2007/12/21(金) 19:08:24#include "Windows.h"
#define Sprintf sprintf
char localbuffer[256]; // 検索されたキーの保存、メッセージ表示に使用
char title[] = "空文字列の標準(既定)の検索と削除";
HKEY *ThisSideHandle[256]; // 256個までハンドルを記憶
unsigned int Success = 0, Failure = 0; // 削除に成功または失敗した数を記憶
void DelNullValue(HKEY handle, char *subkey);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
if(!CreateMutex(NULL, 1, "DelNullValue")) {
MessageBox(NULL, "ミューテックスオブジェクトの作成に失敗しました。", title, MB_ICONSTOP);
return 1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS) {
MessageBox(NULL, "DelNullValue.exe は既に起動しております。", title, MB_ICONSTOP);
return 1;
}
if(MessageBox(NULL, "レジストリから空っぽの標準(既存)を検索し、 削除します。\n\nこのプログラムを実行しますか", title, MB_YESNO) == IDYES) {
DelNullValue(HKEY_LOCAL_MACHINE, NULL);
DelNullValue(HKEY_USERS, NULL);
Sprintf(localbuffer, "削除成功 : %u\n削除失敗 : %u", Success, Failure);
MessageBox(NULL, localbuffer, title, MB_ICONINFORMATION);
}
return 0;
}
0009デフォルトの名無しさん
2007/12/21(金) 19:08:57HKEY handle1, handle2;
DWORD i, n, type, size, st;
if(RegOpenKeyEx(handle, subkey, NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &handle1) == ERROR_SUCCESS) {
*ThisSideHandle[st++] = handle1; // ハンドルを退避する
RegEnumKey(handle1, i++, localbuffer, sizeof localbuffer); //キーを検挙
DelNullValue(handle1, localbuffer);
RegOpenKeyEx(handle1, localbuffer, NULL, KEY_QUERY_VALUE | KEY_SET_VALUE, &handle2);
if(RegQueryValueEx(handle2, NULL, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
if(size == 1 && type == REG_SZ || type == REG_EXPAND_SZ) {
if(RegDeleteValue(handle2, NULL) == ERROR_SUCCESS) Success++; else Failure++;
}
RegCloseKey(handle2);
}
handle1 = *ThisSideHandle[st--]; // ハンドルを復元する
RegCloseKey(handle1);
}
}
0010デフォルトの名無しさん
2007/12/21(金) 19:12:18自分でいうのはなんだがバクが多そうだな
0011デフォルトの名無しさん
2007/12/21(金) 21:40:20void SearchNullValue(HKEY handle, char *subkey) {
HKEY ForRetrievalHandle; DWORD i, n;
if(subkey == NULL) {
if(RegOpenKeyEx(handle, subkey, NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &ForRetrievalHandle) != ERROR_SUCCESS) return;
}
else {
ForRetrievalHandle = handle;
}
handle_pysh(); // ← ForRetrievalHandleを退避するマクロ
RegQueryInfoKey(ForRetrievalHandle, NULL, NULL, NULL, &n, NULL, NULL, NULL, NULL, NULL, NULL, NULL); //キーの数を取得
if(n == NULL) { // ← サブキーが0なら終了
DelNullValue(ForRetrievalHandle, subkey);
RegCloseKey(ForRetrievalHandle);
return;
}
for(i = 0; i != n;) {
RegEnumKey(ForRetrievalHandle, i++, localbuffer, sizeof localbuffer);
DelNullValue(ForRetrievalHandle, localbuffer);
SearchNullValue(ForRetrievalHandle, localbuffer);
}
handle_pop(); // ← ForRetrievalHandleを復元するマクロ
}
0012デフォルトの名無しさん
2007/12/21(金) 21:40:56void DelNullValue(HKEY handle, char *subkey) {
HKEY ForDeletionHandle;
RegOpenKeyEx(handle, subkey, NULL, KEY_QUERY_VALUE | KEY_SET_VALUE, &ForDeletionHandle);
if(RegQueryValueEx(ForDeletionHandle, NULL, NULL, &type, NULL, &size) == ERROR_SUCCESS)
if(size == 1 && type == REG_SZ || type == REG_EXPAND_SZ) {
if(RegDeleteValue(ForDeletionHandle, NULL) == ERROR_SUCCESS) Success++; else Failure++;
}
}
RegCloseKey(ForDeletionHandle);
}
0013デフォルトの名無しさん
2007/12/22(土) 18:16:22#include "Shlwapi.h"
#include "Windows.h"
#define Sprintf sprintf
#define handle_pop // ← ここを定義できればとりあえず完成
#define handle_push // ← ここを定義できればとりあえず完成
char title[] = "空文字列の標準(既定)の検索と削除";
char LocalBuffer[256]; // 検索されたキーの保存、メッセージ表示などに使用
HKEY ForRetrievalHandle, ForDeletionHandle;
DWORD Success = 0, Failure = 0;
int FromTheInside; // DeletionNullValue自身がDeletionNullValueを呼び出したか判定するのに使用
void DeletionNullValue(void);
void DeletionNullValueStart(HKEY);
0014デフォルトの名無しさん
2007/12/22(土) 18:17:05{
if(!CreateMutex(NULL, 1, "DelNullValue")) {
MessageBox(NULL, "ミューテックスオブジェクトの作成に失敗しました。", title, MB_ICONSTOP);
return 1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS) {
MessageBox(NULL, "DelNullValue.exe は既に起動しております。", title, MB_ICONSTOP);
return 1;
}
if(MessageBox(NULL, "レジストリから空っぽの標準(既存)を検索し、 削除します。\n\nこのプログラムを実行しますか", title, MB_YESNO) == IDYES) {
DeletionNullValueStart(HKEY_LOCAL_MACHINE);
DeletionNullValueStart(HKEY_USERS);
Sprintf(LocalBuffer, "削除成功 : %u\n削除失敗 : %u", Success, Failure);
MessageBox(NULL, LocalBuffer, title, MB_ICONINFORMATION);
}
return 0;
}
// 検索を開始する
void DeletionNullValueStart(HKEY handle) {
FromTheInside = NULL;
ForRetrievalHandle = handle;
DeletionNullValue();
}
0015デフォルトの名無しさん
2007/12/22(土) 18:17:32// キーを検索し、空文字列の標準を発見したら削除する
void DeletionNullValue(void) {
DWORD n, i, type, size;
if(FromTheInside == NULL) {
FromTheInside = 1;
}
else {
handle_push; // ← ForRetrievalHandleを退避するマクロ
if(RegOpenKeyEx(ForRetrievalHandle, LocalBuffer, NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &ForRetrievalHandle) != ERROR_SUCCESS) return;
}
RegQueryInfoKey(ForRetrievalHandle, NULL, NULL, NULL, &n, NULL, NULL, NULL, NULL, NULL, NULL, NULL); // ← キーの数を取得
if(n != NULL) { // ← サブキーがない場合、何もしない。
for(i = 0; i != n;) {
RegEnumKey(ForRetrievalHandle, i++, LocalBuffer, sizeof LocalBuffer); // ← サブキーを検挙
RegOpenKeyEx(ForRetrievalHandle, LocalBuffer, NULL, KEY_QUERY_VALUE | KEY_SET_VALUE, &ForDeletionHandle); // ← 削除用のハンドルをオープンする
if(RegQueryValueEx(ForDeletionHandle, NULL, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
if(size == 1 && type == REG_SZ || type == REG_EXPAND_SZ) {
if(RegDeleteValue(ForDeletionHandle, NULL) == ERROR_SUCCESS) Success++; else Failure++; // ← 標準(既存)が空文字列なら削除する
}
}
RegCloseKey(ForDeletionHandle); // ← 削除用のハンドルをクローズする
DeletionNullValue(); // ← サブキーの下にサブキーがある場合はそのサブキーも検挙する
}
}
RegCloseKey(ForRetrievalHandle);
if(FromTheInside != NULL) {
handle_pop; // ← ひとつ手前のサブキーのForRetrievalHandleを復元するマクロ
}
}
0016とりあえず完成?
2007/12/22(土) 23:09:27#include "Windows.h"
#define Sprintf sprintf
char LocalBuffer[256]; // 検索されたキーの保存、メッセージ表示などに使用
HKEY ForRetrievalHandle, ForDeletionHandle, cf[256];
DWORD Success = 0, Failure = 0, Tree = 0, ci[256], cn[256];
void DeletionNullValue(void);
void DeletionNullValueStart(HKEY);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
char title[] = "空文字列の標準(既定)の検索と削除";
if(!CreateMutex(NULL, 1, "DelNullValue")) {
MessageBox(NULL, "ミューテックスオブジェクトの作成に失敗しました。", title, MB_ICONSTOP);
return 1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS) {
MessageBox(NULL, "DelNullValue.exe は既に起動しております。", title, MB_ICONSTOP);
return 1;
}
if(MessageBox(NULL, "レジストリから空っぽの標準(既存)を検索し、 削除します。\n\nこのプログラムを実行しますか", title, MB_YESNO) == IDYES) {
DeletionNullValueStart(HKEY_LOCAL_MACHINE);
DeletionNullValueStart(HKEY_USERS);
Sprintf(LocalBuffer, "削除成功 : %u\n削除失敗 : %u", Success, Failure);
MessageBox(NULL, LocalBuffer, title, MB_ICONINFORMATION);
}
return 0;
}
0017とりあえず完成?
2007/12/22(土) 23:10:32void DeletionNullValueStart(HKEY handle) {
ForRetrievalHandle = handle;
DeletionNullValue();
}
// キーを検索し、空文字列の標準を発見したら削除する。
void DeletionNullValue(void) {
DWORD n, i, type, size;
RegQueryInfoKey(ForRetrievalHandle, NULL, NULL, NULL, &n, NULL, NULL, NULL, NULL, NULL, NULL, NULL); // ← キーの数を取得
if(n != NULL) { // ← サブキーがない場合、何もしない。
for(i = 0; i != n;) {
RegEnumKey(ForRetrievalHandle, i++, LocalBuffer, sizeof LocalBuffer); // ← サブキーを検挙
RegOpenKeyEx(ForRetrievalHandle, LocalBuffer, NULL, KEY_QUERY_VALUE | KEY_SET_VALUE, &ForDeletionHandle); // ← 削除用のハンドルをオープンする
if(RegQueryValueEx(ForDeletionHandle, NULL, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
if(size == 1 && type == REG_SZ || type == REG_EXPAND_SZ) {
if(RegDeleteValue(ForDeletionHandle, NULL) == ERROR_SUCCESS) Success++; else Failure++; // ← 標準(既存)が空文字列なら削除する
}
RegCloseKey(ForDeletionHandle); // ← 削除用のハンドルをクローズする
}
ci[Tree] = i; cn[Tree] = n; cf[Tree] = ForRetrievalHandle; Tree++; // ← サブキーの最大値と何番目のサブキーを検索中なのかを保存
RegOpenKeyEx(ForRetrievalHandle, LocalBuffer, NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &ForRetrievalHandle); // ← サブキーをオープンする
DeletionNullValue();
RegCloseKey(ForRetrievalHandle);
--Tree; i = ci[Tree]; n = cn[Tree]; ForRetrievalHandle = cf[Tree]; // ← サブキーの最大値と何番目のサブキーを検索中なのかを復元
}
}
}
■ このスレッドは過去ログ倉庫に格納されています