いつもお世話になっております。
環境:WinXP VC++6.0
RegSetValueEx等を使って環境変数(レジストリ)を書き換えた
のですが、再起動しないとやはり反映しないようです。
例えばKEY=C:\AAA
という環境変数を作って、これを
KEY=C:\BBBに変更して
DOSコマンドからCD %KEY%
をやってもC:\AAAのディレクトリに移動します。
PCを再起動するとC:\BBBに移動できます。
レジストリは正しく書き換わっていますが
実際には再起動するまで更新されていないようです。
他の書き込みを調べると以下のようなキーワードが出てきました。
SystemParametersInfo
SHChangeNotify
BroadcastSystemMessage
しかし引数が違うのか、どれをやっても
うまくいきません。宜しくお願い致します。
SystemParametersInfoで事足りるなら直接レジストリを扱うよりも
この関数でやった方が良いと思います。
この関数なら変更後の通知も確か出来たはずです。
直接、レジストリの値を変更する場合はKerryさんの方法を試してみてはどうでしょうか。
お答えありがとうございます。
以下のようにやってみましたが、
結果は同じでやはり再起動しないと反映されません。
第2引数がよくわからないので、
いろいろ変えてやってみたのですが。
DWORD dw = BSM_APPLICATIONS;
::BroadcastSystemMessage( BSF_POSTMESSAGE, &dw, WM_SETTINGCHANGE, 0, 0 );
SystemParametersInfoも引数が沢山あり、
いろいろ試していますがどうもうまくいきません。
.NETなら簡単にできるということはないでしょうか。
.NETでも構わないのですが。
> .NETでも構わないのですが。
確認ですが、
>VC++6.0
では.NET Frameworkをほぼ使えないのですが、
VC2002以上の環境があるのでしょうか?
書き換える前に起動してたコマンドプロンプト内に反映したいって事?
WM_SETTINGCHANGEのヘルプを確認してください。
::BroadcastSystemMessage(BSF_POSTMESSAGE, &dw, WM_SETTINGCHANGE, 0, LPARAM(_T
(Environment)));
ではどうでしょうか?
ちなみに、コマンドプロンプトに反映するにはコマンドプロンプトを再起動しなければ
いけません。
Kerry さんの紹介されているリンクページを読み、試しましたか。
下の方法で出来ますよ。
DWORD dwRet;
LRESULT Ret;
Ret = SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM)TEXT(Environment), SMTO_ABORTIFHUNG,
5000, &dwRet );
if ( Ret ){
/* 正常に WM_SETTINGCHANGE が送れた */
}
else{
/* エラーです */
}
なお、起動中のコマンド・プロンプトは一旦、再起動しないと反映されません。
でもシステムの環境変数の内容(レジストリも含む)は反映されています。
すみません。
Kellyさん、オレンジフィッシュさんに教えていただいたリンクで出来ました。
http://support.microsoft.com/kb/104011/ja
昨日はこのリンク先にアクセスできなくて困っておりました。
コマンドプロンプトは再起動で問題ありません。
.NETは環境をもっているのですが、必要なさそうです。
ありがとうございました。
追加でよろしいでしょうか。
コマンドプロンプトの%KEY%にはすぐに反映されるのですが、
別のアプリからgetenv( KEY );をやると反映されていません。
_environというグローバル変数を参照しているとのことなので、
アプリを再起動すればよいのかと思ったのですが、
アプリ再起動でも反映されませんでした。
何度も申し訳ありませんが、宜しくお願い致します。
環境変数は親(起動元)のプロセスから継承されますので、
親プロセスも再起動させる必要があります。
Kerryさんありがとうございました。
起動元はVCでした。
解決いたしました。
皆さんご親切にありがとうございました。