トップページ⇒tech
17コメント16KB

ソースメモ

■ このスレッドは過去ログ倉庫に格納されています
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
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_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:46
void DelNullValue(HKEY handle) {
HKEY 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:43
void DelNullValue2(HKEY handle, char *subkey) {
HKEY 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
      r;ァ'N;:::::::::::::,ィ/      >::::::::::ヽ
.      〃  ヽル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:43
ひどいソースだな
0007デフォルトの名無しさん2007/12/15(土) 20:35:21
まだ、残っていたんだ。
一週間たたないうたに消えると思っていたが

>>1
#pragma comment(lib, "shlwapi.lib") は不要

>>6
余計なお世話だ。
そこまでいうなら見本でも書いて見ろよ。
>>5よりましか。
0008デフォルトの名無しさん2007/12/21(金) 19:08:24
#include "Shlwapi.h"
#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:57
void DelNullValue(HKEY handle, char *subkey) {
HKEY 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
*ThisSideHandle[st--] は ThisSideHandle[--st] の書き間違い

自分でいうのはなんだがバクが多そうだな
0011デフォルトの名無しさん2007/12/21(金) 21:40:20
// キーを検挙する

void 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:56
// 指定されたキーに標準(既存)がある場合はオープンし、 それが空文字列なら削除する。

void 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
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) {
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 "Shlwapi.h"
#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:32
// 検索を開始する。

void 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]; // ← サブキーの最大値と何番目のサブキーを検索中なのかを復元
}
}
}
■ このスレッドは過去ログ倉庫に格納されています