1

インターネット設定の ProxyEnable および ProxyServer レジストリ キーを変更するクラスがあります。

このクラスをコンソール アプリで使用して実行すると、値が変更され、regedit を使用して変更を確認できます。

うまくいかないのは、アプリケーションのインストール中にレジストリ キーが変更されるように、Installer クラスでこのクラスを使用しようとしていることです。

クラスのコードは次のとおりです。

public class ProxySettings {
    [DllImport("wininet.dll")]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption,
        IntPtr lpBuffer, int dwBufferLength);
    public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
    public const int INTERNET_OPTION_REFRESH = 37;
    static bool settingsReturn, refreshReturn;

    public void EnableProxy(string proxy) {
        RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        registry.SetValue("ProxyEnable", 1);
        registry.SetValue("ProxyServer", proxy);

        settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED,
            IntPtr.Zero, 0);
        refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    }

    public void DisableProxy() {
        RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        registry.SetValue("ProxyEnable", 0);
        registry.DeleteValue("ProxyServer", false);

        settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED,
            IntPtr.Zero, 0);
        refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    }
}

ここに私のインストーラークラスがあります:

[RunInstaller(true)]
public class WindowsServiceInstaller : Installer {
    public WindowsServiceInstaller() {
        ServiceProcessInstaller serviceProcessInstaller =
                           new ServiceProcessInstaller();
        ServiceInstaller serviceInstaller = new ServiceInstaller();

        //# Service Account Information
        serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
        serviceProcessInstaller.Username = null;
        serviceProcessInstaller.Password = null;

        //# Service Information
        serviceInstaller.DisplayName = "Client Service";
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        //# This must be identical to the WindowsService.ServiceBase name
        //# set in the constructor of WindowsService.cs
        serviceInstaller.ServiceName = "Client Service";

        this.Installers.Add(serviceProcessInstaller);
        this.Installers.Add(serviceInstaller);
    }

    public override void Commit(System.Collections.IDictionary savedState) {
        base.Commit(savedState);

        ServiceController controller = new ServiceController("Client Service");
        if(controller.Status != ServiceControllerStatus.Running) {
            controller.Start();
        }

        ProxySettings proxy = new ProxySettings();
        proxy.EnableProxy("127.0.0.1:8889");
    }

    public override void Uninstall(System.Collections.IDictionary savedState) {
        base.Uninstall(savedState);

        ProxySettings proxy = new ProxySettings();
        proxy.DisableProxy();
    }
}

コミットのオーバーライドで、正常に動作するサービスを開始していますが、何らかの理由でレジストリへの変更が表示されません。

クラスが初期化され、起動していることを確認してください

System.Diagnostics.Process.Start("http://www.microsoft.com");

EnableProxy メソッドと DisableProxy メソッドの両方に。インストール中、およびアンインストール中に Web サイトが開きましたが、レジストリは変更されませんでした。

私は何を間違っていますか?インストーラーではなくコンソール アプリとして動作するのはなぜですか?

4

2 に答える 2

2

インストーラーではなくコンソールアプリで機能する理由はわかりませんが、レジストリキーを破棄したり、直接フラッシュしたりしていないことに気付きました。

のコードEnableProxyをこれ(および同様にDisableProxy)に置き換えてみて、何が起こるかを確認してください。

using (RegistryKey registry = Registry.CurrentUser.OpenSubKey(
    "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
{
    registry.SetValue("ProxyEnable", 1);
    registry.SetValue("ProxyServer", proxy);
}

(これは、常に廃棄する必要がある多くの理由の1つですIDisposable

于 2010-01-18T15:27:53.720 に答える
0

さて、私は何が起こっているのかを理解しました。

Everyone にインストールするようにインストーラーを設定しました。Just Meをインストールして選択してみましたが、うまくいきました。

現在のユーザーのレジストリ キーを設定していたのに、すべてのユーザーにインストールしていたので、これは理にかなっていると思います。これは正しいと思いますか?

とにかく、Just Me 用にインストールした場合にソフトウェアが正しく機能するかどうかを確認するために、さらにテストを行う必要があります。アプリケーションは Windows サービスです。

于 2010-01-18T17:51:28.090 に答える