5

私のC#アプリでは、Oracleクライアントが存在しない場合はプログラムでインストールしています。これには、PATHシステム環境変数にdirを追加する必要があります。これはすべて正常に機能しますが、ユーザーがWindowsにログアウト/ログインするか、再起動するまで有効になりません。この手順を実行せずに、アプリで新しいPATH変数を認識して使用するにはどうすればよいですか?アプリを再起動するだけでも、ユーザーにログアウト/ログインを要求するよりはましです。

おそらく、この変更を他のプロセスにブロードキャストすることは機能するはずです。これが私が試したものですが、成功しませんでした:

    using System.Runtime.InteropServices;

    private const int HWND_BROADCAST = 0xffff;
    private const int WM_WININICHANGE = 0x001a, WM_SETTINGCHANGE = WM_WININICHANGE, INI_INTL = 1;
    [DllImport("user32.dll")]
    private static extern int SendMessageTimeoutA(int hWnd, uint wMsg, uint wParam, string lParam, int fuFlags, int uTimeout, int lpdwResult);

    int rtnVal = 0;
    SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment", 2, 5000, rtnVal);

問題のプロセスを停止して再起動すると、この種の変更が反映されるはずだと言われましたが、アプリを再起動してもうまくいきません。オラクルの問題である可能性があると思います。オラクルに関する何かが変更を認識するためにログインを必要とするのか、私にはわかりません。前もって感謝します。

4

3 に答える 3

1

あなたの問題は、特定のアプリのみがそのメッセージ(エクスプローラーなど)をリッスンするため、アプリケーションではまったく使用されません。環境は一般に継承されるため、現在の環境ブロックを取得するため、アプリ自体を再起動しても役に立ちません。ユーザーがスタート メニューから再起動すると、機能します (WM_SETTINGCHANGE がブロードキャストされていると仮定します)。

Environment.GetEnvironmentVariable を使用して、レジストリから現在の値を読み取り、それを現在の環境にマージするのが最適です。基本的にやっている

Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine) + ";" + (Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.User)));

于 2009-11-16T23:39:58.697 に答える
1

Environment.GetEnvironmentVariable(" MYVAR ", EnvironmentVariableTarget.Machine)は機能しませんか?

アプリが昇格して実行されている場合は、次のことができます

 Environment.SetEnvironmentVariable("MYVAR", "cool", EnvironmentVariableTarget.Machine);

//do some other stuff...

Console.WriteLine(Environment.GetEnvironmentVariable("MYVAR", EnvironmentVariableTarget.Machine));

C:\TestApp>>TestApp.exe
cool

これが他の実行中のプロセスで機能するかどうかはわかりませんが、取得/設定を行うアプリでは機能するはずです

于 2009-11-16T23:06:46.930 に答える
0

このプロジェクトでは、Instant Client アーカイブの「install.bat」を使用して Oracle Instant Client をセットアップします。例えば:

install.bat odp.net1x %1 名

于 2009-11-22T18:09:14.663 に答える