再起動せずにレジストリを更新 – プログラミング – Home

再起動せずにレジストリを更新
 
通知
すべてクリア

[解決済] 再起動せずにレジストリを更新


きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

いつもお世話になっております。
環境:WinXP VC++6.0

RegSetValueEx等を使って環境変数(レジストリ)を書き換えた
のですが、再起動しないとやはり反映しないようです。

例えばKEY=C:\AAA
という環境変数を作って、これを
KEY=C:\BBBに変更して
DOSコマンドからCD %KEY%
をやってもC:\AAAのディレクトリに移動します。
PCを再起動するとC:\BBBに移動できます。
レジストリは正しく書き換わっていますが
実際には再起動するまで更新されていないようです。

他の書き込みを調べると以下のようなキーワードが出てきました。
SystemParametersInfo
SHChangeNotify
BroadcastSystemMessage

しかし引数が違うのか、どれをやっても
うまくいきません。宜しくお願い致します。


引用未解決
トピックタグ
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

WM_SETTINGCHANGEメッセージを送れば良いようです。

http://support.microsoft.com/kb/104011/ja


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

SystemParametersInfoで事足りるなら直接レジストリを扱うよりも
この関数でやった方が良いと思います。
この関数なら変更後の通知も確か出来たはずです。

直接、レジストリの値を変更する場合はKerryさんの方法を試してみてはどうでしょうか。


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

お答えありがとうございます。
以下のようにやってみましたが、
結果は同じでやはり再起動しないと反映されません。
第2引数がよくわからないので、
いろいろ変えてやってみたのですが。

DWORD dw = BSM_APPLICATIONS;
::BroadcastSystemMessage( BSF_POSTMESSAGE, &dw, WM_SETTINGCHANGE, 0, 0 );

SystemParametersInfoも引数が沢山あり、
いろいろ試していますがどうもうまくいきません。

.NETなら簡単にできるということはないでしょうか。
.NETでも構わないのですが。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> .NETでも構わないのですが。
確認ですが、
>VC++6.0
では.NET Frameworkをほぼ使えないのですが、
VC2002以上の環境があるのでしょうか?


返信引用
とーりすがり
 とーりすがり
(@とーりすがり)
ゲスト
結合: 18年前
投稿: 29
 

書き換える前に起動してたコマンドプロンプト内に反映したいって事?


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

WM_SETTINGCHANGEのヘルプを確認してください。

::BroadcastSystemMessage(BSF_POSTMESSAGE, &dw, WM_SETTINGCHANGE, 0, LPARAM(_T
(Environment)));

ではどうでしょうか?

ちなみに、コマンドプロンプトに反映するにはコマンドプロンプトを再起動しなければ
いけません。


返信引用
オレンジフィッシュ
 オレンジフィッシュ
(@オレンジフィッシュ)
ゲスト
結合: 18年前
投稿: 58
 

Kerry さんの紹介されているリンクページを読み、試しましたか。
下の方法で出来ますよ。

DWORD dwRet;
LRESULT Ret;

Ret = SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0,
 (LPARAM)TEXT(Environment), SMTO_ABORTIFHUNG,
 5000, &dwRet );

if ( Ret ){
 /* 正常に WM_SETTINGCHANGE が送れた */
}
else{
 /* エラーです */
}

なお、起動中のコマンド・プロンプトは一旦、再起動しないと反映されません。
でもシステムの環境変数の内容(レジストリも含む)は反映されています。


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

すみません。
Kellyさん、オレンジフィッシュさんに教えていただいたリンクで出来ました。

http://support.microsoft.com/kb/104011/ja

昨日はこのリンク先にアクセスできなくて困っておりました。
コマンドプロンプトは再起動で問題ありません。
.NETは環境をもっているのですが、必要なさそうです。
ありがとうございました。


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

追加でよろしいでしょうか。
コマンドプロンプトの%KEY%にはすぐに反映されるのですが、
別のアプリからgetenv( KEY );をやると反映されていません。
_environというグローバル変数を参照しているとのことなので、
アプリを再起動すればよいのかと思ったのですが、
アプリ再起動でも反映されませんでした。
何度も申し訳ありませんが、宜しくお願い致します。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

環境変数は親(起動元)のプロセスから継承されますので、
親プロセスも再起動させる必要があります。


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

Kerryさんありがとうございました。
起動元はVCでした。

解決いたしました。
皆さんご親切にありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました