スクリーンセーバーのレジストリのリダイレクト(64bit)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
parapara

スクリーンセーバーのレジストリのリダイレクト(64bit)

#1

投稿記事 by parapara » 11年前

スクリーンセーバーのレジストリのリダイレクト(64bit)
猫でも(第二版)10章3節、 設定できるスクリーンセーバーで
HKEY_CURRENT_USER\Control Panel\Screen Saver.screensv02にキーを作っているのですが、
リダイレクトされないだけではなく、作った設定用のダイアログに数字が表示されているはずなのに、
表示されていない。それだけではなく、設定用ダイアログで設定しても、バグります。
以下にソースを掲載します。お助けください。
因みに、c:\\windows\\syswow64\\に入れました。リダイレクトされません。
このプログラムが32bitだからでしょうか?

コード:

// 初めてのスクリーンセーバーProject.cpp : アプリケーションのエントリ ポイントを定義します。
//

#pragma once

// Windows ヘッダーから使用されていない部分を除外します。
// Windows ヘッダー ファイル:
#include <windows.h>
#include<WindowsX.h>
// C ランタイム ヘッダー ファイル
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource1.h"
#include<scrnsave.h>
#define ID_MYTIMER 100
// グローバル変数:
// 現在のインターフェイス
static HKEY hMyKey;
static UINT nSpeed,nNo;//表示間隔と表示回数
static char szText[64];//表示文字列

// このコード モジュールに含まれる関数の宣言を転送します:




//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
//  コメント:
//
//    この関数および使い方は、'RegisterClassEx' 関数が追加された
//    Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
//    アプリケーションが、関連付けられた
//    正しい形式の小さいアイコンを取得できるようにするには、
//    この関数を呼び出してください。
//


//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND	- アプリケーション メニューの処理
//  WM_PAINT	- メイン ウィンドウの描画
//  WM_DESTROY	- 中止メッセージを表示して戻る
//
//
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int x,y,xw,yh;
	HDC hdc;
	BITMAP bmp_info;
	static RECT rc;
	static char *lpszTitle="猫でも分かるwindowsプログラミング";
	static HBITMAP hMyBmp;
	static HDC hdc_mem;
	static int n;
	DWORD dwResult,dwSize,dwType;

	switch (message)
	{
	case WM_CREATE:
		RegCreateKeyEx(HKEY_CURRENT_USER,
			"Control panel\\Screen Saver.screensv02",
			0,NULL,REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,NULL,
			&hMyKey,&dwResult);
		if(dwResult==REG_CREATED_NEW_KEY){//新規にレジストリ書き込み
			nSpeed=300;
			RegSetValueEx(hMyKey,
				"Speed",0,REG_DWORD,
				(LPBYTE)&nSpeed,sizeof(DWORD));
			strcpy(szText,"猫でもわかるwindowsプログラミング");
			RegSetValueEx(hMyKey,
				"Text",0,REG_SZ,
				(LPBYTE)szText,strlen(szText)+1);
			nNo=20;
			RegSetValueEx(hMyKey,
				"No",0,REG_DWORD,
				(LPBYTE)&nNo,sizeof(DWORD));
		}else{//レジストリ開いた場合
			dwSize=(DWORD)sizeof(DWORD);
			RegQueryValueEx(hMyKey,
				"Speed",0,&dwType,(LPBYTE)&nSpeed,&dwSize);
			dwSize=(DWORD)sizeof(szText);
			RegQueryValueEx(hMyKey,
				"Text",0,&dwType,(LPBYTE)szText,&dwSize);
			dwSize=(DWORD)sizeof(DWORD);
			RegQueryValueEx(hMyKey,
				"No",0,&dwType,(LPBYTE)&nNo,&dwSize);
		}
		if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
			MessageBox(hWnd,"RegCloseKeyに失敗しました",
				"Error",
				MB_OK);
		}
		SetTimer(hWnd,ID_MYTIMER,nSpeed,NULL);
		GetClientRect(hWnd,&rc);
		break;
	case WM_TIMER:
		if(wParam!=ID_MYTIMER)break;

		hdc=GetDC(hWnd);
		hMyBmp=LoadBitmap(hMainInstance,"MYBMP");
		hdc_mem=CreateCompatibleDC(hdc);
		SelectObject(hdc_mem,hMyBmp);
		GetObject(hMyBmp,sizeof(BITMAP),&bmp_info);
		DeleteObject(hMyBmp);//残っているのはhdc_memだけ
		BitBlt(hdc,x=rand()%rc.right-36,y=rand()%rc.bottom,xw=bmp_info.bmWidth,yh=bmp_info.bmHeight
			,hdc_mem,0,0,SRCCOPY);
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc,RGB(rand()%256,rand()%256,rand()%256));
		TextOut(hdc,x+xw,y+yh-12,lpszTitle,strlen(lpszTitle));
		n++;
		if(n>(int)nNo){
			n=0;
			PatBlt(hdc,0,0,rc.right,rc.bottom,BLACKNESS);
		}
		DeleteDC(hdc_mem);
		ReleaseDC(hWnd,hdc);
		break;
	case WM_DESTROY:
		KillTimer(hWnd,ID_MYTIMER);
		PostQuitMessage(0);
		break;
	default:
		break;
	}
	return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
BOOL WINAPI	ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wp, LPARAM lp)
{
	static HWND hSpeed,hText,hNo;
	char szBuf[256];
	DWORD dwResult,dwType,dwSize;
	switch(message){
	case WM_INITDIALOG:
		return TRUE;
		hSpeed=GetDlgItem(hDlg,IDC_EDIT1);
		hText=GetDlgItem(hDlg,IDC_EDIT2);
		hNo=GetDlgItem(hDlg,IDC_EDIT3);
		RegCreateKeyEx(HKEY_CURRENT_USER,
			"Control panel\\Screen Saver.screensv02",
			0,NULL,REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,NULL,
			&hMyKey,&dwResult);

		dwSize=(DWORD)sizeof(DWORD);
		RegQueryValueEx(hMyKey,
			"Speed",0,&dwType,(LPBYTE)&nSpeed,&dwSize);
		dwSize=(DWORD)sizeof(szText);
		RegQueryValueEx(hMyKey,
			"Text",0,&dwType,(LPBYTE)szText,&dwSize);
		dwSize=(DWORD)sizeof(DWORD);
		RegQueryValueEx(hMyKey,
			"No",0,&dwType,(LPBYTE)&nNo,&dwSize);

		Edit_SetText(hText,szText);
		//表示間隔
		_itoa(nSpeed,szBuf,10);
		Edit_SetText(hSpeed,szBuf);
		//表示回数
		_itoa(nNo,szBuf,10);
		Edit_SetText(hNo,szBuf);

		if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
			MessageBox(hDlg,"RegCloseKeyに失敗しました",
				"Error",
				MB_OK);
		}
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wp)){
		case IDOK:
			Edit_GetText(hSpeed,szBuf,sizeof(szBuf)-1);
			nSpeed=atoi(szBuf);
			Edit_GetText(hText,szText,sizeof(szText)-1);
			Edit_GetText(hNo,szBuf,sizeof(szBuf)-1);
			nNo=atoi(szBuf);

			RegCreateKeyEx(HKEY_CURRENT_USER,
				"Control panel\\Screen Saver.screensv02",
				0,NULL,REG_OPTION_NON_VOLATILE,
				KEY_ALL_ACCESS,NULL,
				&hMyKey,&dwResult);

			
			RegSetValueEx(hMyKey,
				"Speed",0,REG_DWORD,
				(LPBYTE)&nSpeed,sizeof(DWORD));
			
			RegSetValueEx(hMyKey,
				"Text",0,REG_SZ,
				(LPBYTE)szText,strlen(szText)+1);
			
			RegSetValueEx(hMyKey,
				"No",0,REG_DWORD,
				(LPBYTE)&nNo,sizeof(DWORD));

			if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
				MessageBox(hDlg,"RegCloseKeyに失敗しました",
					"Error",MB_OK);
			}
			EndDialog(hDlg,IDOK);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg,IDCANCEL);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}
BOOL WINAPI	RegisterDialogClasses(HANDLE hInst)
{
	return TRUE;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#2

投稿記事 by softya(ソフト屋) » 11年前

無闇にsystem32/system64に入れてはいけません。ましてや32bitのコードをsystem64に入れるのはマズイです。
それにWindowVistaから導入されたUACの働きで色々問題のあるプログラムは動作を制限されていて、特にsystem32/system64などでの動作は厳しい制限あります。
そもそも、32bitコードのスクリーンセーバーをsystem64に入れる理由がわかりません。

UACの働きについて、どの程度理解されていますでしょうか?
それとレジストリのリダイレクトと言う言葉はどういう意味で使われていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

parapara

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#3

投稿記事 by parapara » 11年前

UACは鬱陶しい警告ぐらいにしか思っていませんでした。煩わしいのでいっそのこと下げても良いレベルより下げて一番下にして無効化しちゃおう位に思っています。そうすればXPと同じくらい使いやすく、しかし、セキュリティに脆弱性があるんですよね?
レジストリのリダイレクトとは
32ビット用のプログラムが32bitOS前提の32bitの規定の特別な働きがある場所のレジストリに書き込もうとするとき、
64ビットのレジストリの機能が32bitエミュレーションのsyswow64の代換の場所のレジストリに誘導する機能だと思っています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#4

投稿記事 by softya(ソフト屋) » 11年前

>UACは鬱陶しい警告ぐらいにしか思っていませんでした。煩わしいのでいっそのこと下げても良いレベルより下げて一番下にして無効化しちゃおう位に思っています。そうすればXPと同じくらい使いやすく、しかし、セキュリティに脆弱性があるんですよね?

プログラムを作る勉強をしていて覚えたこと役立てるためにも、あるいは他の人に配布する気が少しでもあるならやってはいけません。
UACは最大限に活用してマイクロソフトの規約に従ってください。

>レジストリのリダイレクトとは
>32ビット用のプログラムが32bitOS前提の32bitの規定の特別な働きがある場所のレジストリに書き込もうとするとき、
>64ビットのレジストリの機能が32bitエミュレーションのsyswow64の代換の場所のレジストリに誘導する機能だと思っています。

> c:\\windows\\syswow64\\に入れました。
あっ私も混乱してましたね。 system32はややこしいですが64bitのプログラムです。
syswow64が32bitのプログラムですね。

あとで動作を確認してみますので、お待ちください。
次回はいつ頃掲示板に来れそうですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

parapara

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#5

投稿記事 by parapara » 11年前

すみません、よろしくお願いします。次回いつ来れるかは私事が大変というか危機状態なので、いつ来れるかは確約できません。申し訳ありません。

parapara

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#6

投稿記事 by parapara » 11年前

なるべく早くお返事するように致しますので、ご回答何卒よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#7

投稿記事 by softya(ソフト屋) » 11年前

parapara さんが書きました:なるべく早くお返事するように致しますので、ご回答何卒よろしくお願いいたします。
すいません。しばらく見に来られないと思っていたので、まだ確認しておりません。
これから見てみます。

【追記】
resource.hなどリソースも欲しいですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

parapara

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#8

投稿記事 by parapara » 11年前

すみません、ファイルの添付のやり方が調べても分かりませんでした。
-----------resource1.h-------------------------------------------------------------------------------------------------------------------------

コード:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by 初めてのスクリーンセーバーProject.rc
//
#define IDC_EDIT1                       1000
#define IDC_EDIT2                       1001
#define IDC_EDIT3                       1002
#define DLG_SCRNSAVECONFIGURE           2003

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1003
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


--------------------初めてのスクリーンセーバーProject.rc--------------------------------------------------------
// Microsoft Visual C++ generated resource script.
//
#include "resource1.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 日本語 (日本) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource1.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

MYBMP                   BITMAP                  "bitmap.bmp"

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

DLG_SCRNSAVECONFIGURE DIALOGEX 0, 0, 240, 152
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "設定"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    LTEXT           "表示間隔",IDC_STATIC,27,33,33,8
    EDITTEXT        IDC_EDIT1,73,31,40,14,ES_AUTOHSCROLL
    LTEXT           "表示文字列",IDC_STATIC,27,57,41,8
    EDITTEXT        IDC_EDIT2,74,55,144,14,ES_AUTOHSCROLL
    LTEXT           "表示回数",IDC_STATIC,27,79,33,8
    EDITTEXT        IDC_EDIT3,74,79,40,14,ES_AUTOHSCROLL
    DEFPUSHBUTTON   "OK",IDOK,31,118,50,14
    PUSHBUTTON      "キャンセル",IDCANCEL,151,119,50,14
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    DLG_SCRNSAVECONFIGURE, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 233
        TOPMARGIN, 7
        BOTTOMMARGIN, 145
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // 日本語 (日本) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED




jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#9

投稿記事 by jyosyua » 11年前

ソースファイルです。よろしくお願いいたします。
添付ファイル
初めてのスクリーンセーバーProject.rc.txt
リソース
(5.02 KiB) ダウンロード数: 92 回
初めてのスクリーンセーバーProject.cpp
C++
(5.72 KiB) ダウンロード数: 81 回
resource1.h
ヘッダー
(1.18 KiB) ダウンロード数: 87 回

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#10

投稿記事 by jyosyua » 11年前

画像ファイル乗っけて平気でしょうか?
一応使ったファイルです。

[削除]
画像ファイルは著作権上マズイものなので削除します by softya(ソフト屋)
公開する情報には注意してください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#11

投稿記事 by softya(ソフト屋) » 11年前

jyosyuaさんは、paraparaさんなんですね。
今後は、jyosyuaさんで統一した貰ったほうがよさそうです。
動作に関しては、これから調べます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#12

投稿記事 by jyosyua » 11年前

画像ファイルの件承知いたしました。以後気をつけます。画像ファイルでもアウトなんですね。
jyosyuaで統一したかったのですが、paraparaを昔からこの掲示板で使っていたので、
最初にmixC++が出来たとき、管理人さんに頼んだのですが、めんどくさいようだったので、
以後jyosyuaで統一いたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#13

投稿記事 by softya(ソフト屋) » 11年前

とりえあえず問題は再現しました。

レジストリキーがHKCUの場合リダイレクトしないんじゃないか?と思ってみて調べましたが
HKEY_CURRENT_USER\SOFTWARE\
以下だけがリダイレクトされる様です。

さてうまくいかない原因ですが、とりあえずキーを直してみました。
const char * const REG_KEY = "Software\\jyosyua\\\\Screen Saver.screensv02";
です。
が、しかし、値が入りません。

デバッガで追いかけてみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#14

投稿記事 by softya(ソフト屋) » 11年前

変な所にreturn TURE;(テスト用?)があったのとレジストリに格納場所を変えたら動いているようです。
あと、debugフォルダに置いたまま右クリックのメニューにあるインストールで動作確認しています。

コード:

// 初めてのスクリーンセーバーProject.cpp : アプリケーションのエントリ ポイントを定義します。
//

#pragma once

// Windows ヘッダーから使用されていない部分を除外します。
// Windows ヘッダー ファイル:
#include <windows.h>
#include<WindowsX.h>
// C ランタイム ヘッダー ファイル
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource1.h"
#include<scrnsave.h>

#pragma comment(lib,"scrnsave.lib")
#pragma comment(lib,"comctl32.lib")


#define ID_MYTIMER 100
// グローバル変数:
// 現在のインターフェイス
static HKEY hMyKey;
static UINT nSpeed,nNo;//表示間隔と表示回数
static char szText[64];//表示文字列

// このコード モジュールに含まれる関数の宣言を転送します:



const char * const REG_KEY = "Software\\jyosyua\\\\Screen Saver.screensv02";

//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
//  コメント:
//
//    この関数および使い方は、'RegisterClassEx' 関数が追加された
//    Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
//    アプリケーションが、関連付けられた
//    正しい形式の小さいアイコンを取得できるようにするには、
//    この関数を呼び出してください。
//


//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND	- アプリケーション メニューの処理
//  WM_PAINT	- メイン ウィンドウの描画
//  WM_DESTROY	- 中止メッセージを表示して戻る
//
//
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int x,y,xw,yh;
	HDC hdc;
	BITMAP bmp_info;
	static RECT rc;
	static char *lpszTitle="猫でも分かるwindowsプログラミング";
	static HBITMAP hMyBmp;
	static HDC hdc_mem;
	static int n;
	DWORD dwResult,dwSize,dwType;

	switch (message)
	{
	case WM_CREATE:
		RegCreateKeyEx(HKEY_CURRENT_USER,
			REG_KEY,
			0,NULL,REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,NULL,
			&hMyKey,&dwResult);
		if(dwResult==REG_CREATED_NEW_KEY){//新規にレジストリ書き込み
			nSpeed=300;
			RegSetValueEx(hMyKey,
				"Speed",0,REG_DWORD,
				(LPBYTE)&nSpeed,sizeof(DWORD));
			strcpy(szText,"猫でもわかるwindowsプログラミング");
			RegSetValueEx(hMyKey,
				"Text",0,REG_SZ,
				(LPBYTE)szText,strlen(szText)+1);
			nNo=20;
			RegSetValueEx(hMyKey,
				"No",0,REG_DWORD,
				(LPBYTE)&nNo,sizeof(DWORD));
		}else{//レジストリ開いた場合
			dwSize=(DWORD)sizeof(DWORD);
			RegQueryValueEx(hMyKey,
				"Speed",0,&dwType,(LPBYTE)&nSpeed,&dwSize);
			dwSize=(DWORD)sizeof(szText);
			RegQueryValueEx(hMyKey,
				"Text",0,&dwType,(LPBYTE)szText,&dwSize);
			dwSize=(DWORD)sizeof(DWORD);
			RegQueryValueEx(hMyKey,
				"No",0,&dwType,(LPBYTE)&nNo,&dwSize);
		}
		if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
			MessageBox(hWnd,"RegCloseKeyに失敗しました",
				"Error",
				MB_OK);
		}
		SetTimer(hWnd,ID_MYTIMER,nSpeed,NULL);
		GetClientRect(hWnd,&rc);
		break;
	case WM_TIMER:
		if(wParam!=ID_MYTIMER)break;

		hdc=GetDC(hWnd);
		hMyBmp=LoadBitmap(hMainInstance,"MYBMP");
		hdc_mem=CreateCompatibleDC(hdc);
		SelectObject(hdc_mem,hMyBmp);
		GetObject(hMyBmp,sizeof(BITMAP),&bmp_info);
		DeleteObject(hMyBmp);//残っているのはhdc_memだけ
		BitBlt(hdc,x=rand()%rc.right-36,y=rand()%rc.bottom,xw=bmp_info.bmWidth,yh=bmp_info.bmHeight
			,hdc_mem,0,0,SRCCOPY);
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc,RGB(rand()%256,rand()%256,rand()%256));
		TextOut(hdc,x+xw,y+yh-12,lpszTitle,strlen(lpszTitle));
		n++;
		if(n>(int)nNo){
			n=0;
			PatBlt(hdc,0,0,rc.right,rc.bottom,BLACKNESS);
		}
		DeleteDC(hdc_mem);
		ReleaseDC(hWnd,hdc);
		break;
	case WM_DESTROY:
		KillTimer(hWnd,ID_MYTIMER);
		PostQuitMessage(0);
		break;
	default:
		break;
	}
	return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
BOOL WINAPI	ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wp, LPARAM lp)
{
	static HWND hSpeed,hText,hNo;
	char szBuf[256];
	DWORD dwResult,dwType,dwSize;
	switch(message){
	case WM_INITDIALOG:
		//return TRUE;
		hSpeed=GetDlgItem(hDlg,IDC_EDIT1);
		hText=GetDlgItem(hDlg,IDC_EDIT2);
		hNo=GetDlgItem(hDlg,IDC_EDIT3);
		RegCreateKeyEx(HKEY_CURRENT_USER,
			REG_KEY,
			0,NULL,REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,NULL,
			&hMyKey,&dwResult);

		dwSize=(DWORD)sizeof(DWORD);
		RegQueryValueEx(hMyKey,
			"Speed",0,&dwType,(LPBYTE)&nSpeed,&dwSize);
		dwSize=(DWORD)sizeof(szText);
		RegQueryValueEx(hMyKey,
			"Text",0,&dwType,(LPBYTE)szText,&dwSize);
		dwSize=(DWORD)sizeof(DWORD);
		RegQueryValueEx(hMyKey,
			"No",0,&dwType,(LPBYTE)&nNo,&dwSize);

		Edit_SetText(hText,szText);
		//表示間隔
		_itoa(nSpeed,szBuf,10);
		Edit_SetText(hSpeed,szBuf);
		//表示回数
		_itoa(nNo,szBuf,10);
		Edit_SetText(hNo,szBuf);

		if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
			MessageBox(hDlg,"RegCloseKeyに失敗しました",
				"Error",
				MB_OK);
		}
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wp)){
		case IDOK:
			Edit_GetText(hSpeed,szBuf,sizeof(szBuf)-1);
			nSpeed=atoi(szBuf);
			Edit_GetText(hText,szText,sizeof(szText)-1);
			Edit_GetText(hNo,szBuf,sizeof(szBuf)-1);
			nNo=atoi(szBuf);

			RegCreateKeyEx(HKEY_CURRENT_USER,
				REG_KEY,
				0,NULL,REG_OPTION_NON_VOLATILE,
				KEY_ALL_ACCESS,NULL,
				&hMyKey,&dwResult);

			
			RegSetValueEx(hMyKey,
				"Speed",0,REG_DWORD,
				(LPBYTE)&nSpeed,sizeof(DWORD));
			
			RegSetValueEx(hMyKey,
				"Text",0,REG_SZ,
				(LPBYTE)szText,strlen(szText)+1);
			
			RegSetValueEx(hMyKey,
				"No",0,REG_DWORD,
				(LPBYTE)&nNo,sizeof(DWORD));

			if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
				MessageBox(hDlg,"RegCloseKeyに失敗しました",
					"Error",MB_OK);
			}
			EndDialog(hDlg,IDOK);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg,IDCANCEL);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}
BOOL WINAPI	RegisterDialogClasses(HANDLE hInst)
{
	return TRUE;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

parapara

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#15

投稿記事 by parapara » 11年前

本当ですね^^。変な場所にreturn TRUE;があります。あとはレジストリの格納場所ですか。勉強になります。
後で試してみます。後で結果報告いたします。

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#16

投稿記事 by jyosyua » 11年前

return TRUE;を消したら正常に動作いたしました。でも、本当のレジストリの場所ではないから不味いですよね?
ソフト屋様の言うとおりレジストリの場所も変えないと。
例え話で申し訳ないんですけど、COMみたいなクラスのためのレジストリだったら、そしてたまたま、その記述方法が中途半端に合っていたら、誤動作の原因になりますよね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#17

投稿記事 by softya(ソフト屋) » 11年前

変なレジストリを書き換えてしまったら何が起こるか保証できません。
レジストリを使用するアプリを動かす前にはレジストリをバックアップしたほうが良いです。
それと書き込む前に、該当のレジストリの内容をチェックしておくことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#18

投稿記事 by jyosyua » 11年前

以前から気になっていたのですが、レジストリのバックアップってどうやるのでしょうか?
やっぱりシステムの復元で復元ポイントを作ることでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#19

投稿記事 by softya(ソフト屋) » 11年前

jyosyua さんが書きました:以前から気になっていたのですが、レジストリのバックアップってどうやるのでしょうか?
やっぱりシステムの復元で復元ポイントを作ることでしょうか?
それも方法ですが、regeditでエクポートする方法もありますし、レジストリクリーナーなどのツールの機能でバックアップすることもできます。
どれでも正解です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#20

投稿記事 by jyosyua » 11年前

>>regeditでエクポートする方法もありますし
仰るとおりの方法で出来ました。頭良いですね~~^^。凄い。そもそも、regedit怖くてあまり触ったことありませんでした。
ありがとうございました。

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#21

投稿記事 by jyosyua » 11年前

>>レジストリキーがHKCUの場合リダイレクトしないんじゃないか?と思ってみて調べましたが
>>HKEY_CURRENT_USER\SOFTWARE\
>>以下だけがリダイレクトされる様です。
その場所以下にやればどこの場所でも正しいディレクトリへ誘導してくれるのでしょうか。ソフトの拡張子などによって。

それともHKEY_CURRENT_USER\SOFTWARE\以下だけはどんなソフトの値でも置いて良い場所なんでしょうか?

>>さてうまくいかない原因ですが、とりあえずキーを直してみました。
>>const char * const REG_KEY = "Software\\jyosyua\\\\Screen Saver.screensv02";
>>です。
2番目のconstの意味ってどういう意味なんでしょうか?どうか教えてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#22

投稿記事 by softya(ソフト屋) » 11年前

>それともHKEY_CURRENT_USER\SOFTWARE\以下だけはどんなソフトの値でも置いて良い場所なんでしょうか?

regeditでHKEY_CURRENT_USER\SOFTWARE\以下を覗いてみましたか?
ちゃんと会社名とかソフト名で自分ソフト専用の場所にデータを格納しているはずです。
他ソフトとの衝突を防ぐためにも出来るだけユニークな固有名を使ってください。

>2番目のconstの意味ってどういう意味なんでしょうか?どうか教えてください。

1つ目はポインタ変数を書き換えないconstで、2つ目はポインタ先を書き換えないconstです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yukihiro

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#23

投稿記事 by yukihiro » 11年前

> 1つ目はポインタ変数を書き換えないconstで、2つ目はポインタ先を書き換えないconstです。

逆じゃないですかね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#24

投稿記事 by softya(ソフト屋) » 11年前

yukihiro さんが書きました:> 1つ目はポインタ変数を書き換えないconstで、2つ目はポインタ先を書き換えないconstです。

逆じゃないですかね。
あっ、すいません逆ですね。失礼しました。

正解は、2つ目はポインタ変数を書き換えないconstで、1つ目はポインタ先を書き換えないconstです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyosyua
記事: 65
登録日時: 13年前
住所: 八王子市
連絡を取る:

Re: スクリーンセーバーのレジストリのリダイレクト(64bit)

#25

投稿記事 by jyosyua » 11年前

色々教えてもらい、大変有難く、勉強になります。ありがとうございます。
constの宣言の場所は数冊参考書をやりましたが、出ていませんでした。

regeditでエクスポートする場合、コンピューターを選んだ状態じゃないと全体のバックアップ取れないんですね。気づきました。

閉鎖

“C言語何でも質問掲示板” へ戻る