レジストリの書き込み

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

レジストリの書き込み

#1

投稿記事 by ifmmpxpsme2964 » 14年前

http://dixq.net/forum/viewtopic.php?f=3&t=7188

を参考に自身のファイル名を

レジストリに書きこむ簡単なプログラムを作っているのですが

コンパイルしても何も変わりません。

管理者権限での実行もしました。

環境はwindows 7 64bit で vc++ でコンパイルしています。

以下がソースコードです。

ちなみにところどころを

printf("エラー%dが発生しました\n", WSAGetLastError());

を追加したのですが、

エラー番号は0でした。

また、デバッグした結果

コード:

if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,&key)) 
の箇所がうまくいっていないような気がしました。

コード:

#include <windows.h>
TCHAR buf[MAX_PATH+1];
int setkey() {
    HKEY key=NULL;
    int sz=GetModuleFileName(NULL,buf,sizeof(buf))+1;//a
    if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,&key)){//a
        RegSetValueEx(key,TEXT("DTCLNR"),0,REG_SZ,(const BYTE*)buf,sz*sizeof(TCHAR));
        RegCloseKey(key);
    }
	return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    setkey();
}

アバター
asd
記事: 319
登録日時: 15年前

Re: レジストリの書き込み

#2

投稿記事 by asd » 14年前

ifmmpxpsme2964 さんが書きました: http://dixq.net/forum/viewtopic.php?f=3&t=7188

を参考に自身のファイル名を
レジストリに書きこむ簡単なプログラムを作っているのですが
コンパイルしても何も変わりません。
何も変わらないことは、レジストリエディタなどで直接レジストリを覗いたのでしょうか。
#細かいことをいうとコンパイルして実行しなければ何も変わりませんよね^^;
ifmmpxpsme2964 さんが書きました: 環境はwindows 7 64bit で vc++ でコンパイルしています。
64bit環境で動作させているのですね。
プロジェクトのターゲットマシンはWIN32になっていませんか。

上記の通りであれば、64bit環境で32bitアプリケーションを動作させた場合には、WOW64を使用して
動作しますが、その際レジストリリダイレクタの働きで
HKEY_LOCAL_MACHINE\Software\Wow6432Node の下にリダイレクトされます。

(参考)
http://msdn.microsoft.com/ja-jp/library ... 85%29.aspx

なのでこのツリーの配下にあるMicrosoft\Windows\CurrentVersion\Run を確認してはいかがでしょうか。

もしどうしてもWow6432Nodeにリダイレクトして欲しくない場合には、プロジェクトのターゲットマシンをx64マシン向けに変更すればリダイレクトされずにアクセス可能です。

#ちょっと前に既存のアプリを64bit環境向けにリビルドしたのですが、初期設定を行うインストーラを32bitビルドのまま流用していたので、インストーラで設定したレジストリにアプリ本体からアクセスできない事態に陥った経験があります(ノ∀`)

(追記)
質問中に挙げている「うまくいっていないと思う箇所」について、どうしてそこがうまく言っていないのかを言い添えておくと
回答する人が状況判断をしやすくなると思います。
最後に編集したユーザー asd on 2012年6月22日(金) 10:39 [ 編集 2 回目 ]
Advanced Supporting Developer
無理やりこじつけ(ぉ

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: レジストリの書き込み

#3

投稿記事 by YuO » 14年前

何点か。
  • レジストリのうち,いくつかのキーは64bit Windows上では32bitプロセスに対してのみリダイレクトされます。今回は,HKLM\Software\Microsoft\Window\CurrentVersion\Runなので,HKLM\SoftwareへのアクセスとしてHKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Runにリダイレクトされます。
  • WSAGetLastErrorはWinSock用のエラーステータス取得APIです。
    WSAGetLastError function
    The WSAGetLastError function returns the error status for the last Windows Sockets operation that failed.
    通常はGetLastError APIを使います。
  • Reg系APIは,エラーステータスを戻り値として返します。
    RegOpenKeyEx function
    If the function fails, the return value is a nonzero error code defined in Winerror.h.
先頭の項目が,HKLM\Software\Microsoft\Window\CurrentVersion\Runを探しても見つからない理由です。
システム構成ユーティリティ (msconfig.exe)やWindows Sysinternalsautoruns for Windowsで見れば,Wow6432Nodeに書き込まれていることが見つかったと思いますよ。

ifmmpxpsme2964

Re: レジストリの書き込み

#4

投稿記事 by ifmmpxpsme2964 » 14年前

asdさん、YuOさんありがとうございます。

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

にありました。

あと、このままでも自動的に起動されるでしょうか。(されるのでしょうけど念のため・・・)

他のwindowsのOS( 32bitなど )でもうまく起動されるでしょうか。

質問が多いですが、よろしくお願いします。

アバター
asd
記事: 319
登録日時: 15年前

Re: レジストリの書き込み

#5

投稿記事 by asd » 13年前

返信が遅くなりました、すみません。
ifmmpxpsme2964 さんが書きました:asdさん、YuOさんありがとうございます。
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
にありました。
あと、このままでも自動的に起動されるでしょうか。(されるのでしょうけど念のため・・・)
起動するとは思いますが、起動するのと、期待通りの動きをするのは別物だと思うので、
実環境で確認されるのをお勧めします。
ifmmpxpsme2964 さんが書きました: 他のwindowsのOS( 32bitなど )でもうまく起動されるでしょうか。
これも起動するとは思いますが、実際に環境を用意して試されたほうがよいと思います。

動くと思っていたら期待通りの動きをしないという結果になる可能性もありますからね^^;
#歯切れの悪い回答で申し訳ないです
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

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