新的类构造函数-不构造... [英] New class constructor - not constructing...

查看:71
本文介绍了新的类构造函数-不构造...的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好.

首先,我删除了上一个问题,因为我发现它与函数或List<RegistryPreset>变量无关...

涉及到此:
我代表的注册表项的值为:

Hello all.

First I''ve deleted my previous question, because I''ve found it''s not related to the function or the List<RegistryPreset> variable...

It comes to this:
I''m representing a registry key with values as:

[HKEY_CURRENT_USER\KEYNAME]
"ExecutableTarget"="EXECUTABLE NANE"
"Arguments"="COMMAND LING ARGUMETS"
"WorkingDirectory"="WORKING DIRECTORY"
"IconPath"="ICON FILE PATH"
"Description"="DESCRIPTION"
"WindowStyle"=dword
"IconIndex"=dword
"Login"="LOGIN NAME"
"Password"="PASSWORD"



我具有以下功能:



I''m having a function as following:

public static List<registrypreset> LoadRegistryPresets(RegistryKey rkFrom)
{
  List<registrypreset> psetList = null;

  if (rkFrom == null)
  {
    Registry.CurrentUser.CreateSubKey(RunAsPresetSettings.Default.RegRootKey);
  }
  else
  {
    var saPresetsKeyNames = rkFrom.GetSubKeyNames();

    if (saPresetsKeyNames.Length > 0)
    {
      psetList = new List<registrypreset>();
    }

    foreach (var sPresetName in saPresetsKeyNames)
    {
      var rp = new RegistryPreset(rkFrom.OpenSubKey(sPresetName));
      psetList.Add(new RegistryPreset(rkFrom.OpenSubKey(sPresetName)));
    }

  }

  psetList.Sort();

  return (psetList);
}


在循环的第一次迭代之后,
var rp = new RegistryPreset(rkFrom.OpenSubKey(sPresetName));

一切都好,我明白了:


After the first iteration of my loop,
var rp = new RegistryPreset(rkFrom.OpenSubKey(sPresetName));

All is OK, I''m getting this:

rp.Arguments = "http://server/application"
rp.Description = "Preset (profile) description (for the *.lnk file)"
rp.ExecutableTarget = "C:\\Program Files\\Internet Explorer\\iexplore.exe"
rp.IconIndex = 7
rp.IconPath = "C:\\Program Files\\Internet Explorer\\iexplore.exe"
rp.Login = "user Login"
rp.Password = "user Password"
rp.PresetName = "Preset (profile) name (for save and load from the registry)"
rp.WindowStyle = Maximized
rp.WorkingDirectory = "C:\\Program Files\\Internet Explorer\\"



哪个很好
但是从第二步开始,该程序似乎正在使用以前的var rp,好像我在引用它一样-不创建新的,这意味着在调用构造函数时,我不是 rp (and all it''s fields) = null开始但具有最后一个值-几乎就像构造函数正在重用变量内存一样.

任何帮助将不胜感激.

以下是class RegistryPreset-有点长,但是...



Which is fine;
But from the second on, it seems that the program is using the previous var rp as if I''me referencing it - not crating a new one, meaning, when calling the constructor, I''m not starting with rp (and all it''s fields) = null but with the last values - almost like the constructor is reusing the variable memory.

Any help would be appreciated.

Following is the class RegistryPreset - A bit long but...

using System;
using System.Diagnostics;
using System.Security;
using System.Security.AccessControl;
using System.Windows.Forms;
using Microsoft.Win32;
using RunAsPreset.Properties;

namespace RunAsPreset
{
  public class RegistryPreset
  {

    private const string csMessage = "No Preset named  [{0}]  was found.\r\nPlease check the name or verify existance.";

    internal static RegistryKey rkPresetsRoot = ((Registry.CurrentUser.OpenSubKey(Settings.Default.RegRootKey, true)) ??
                                                  (Registry.CurrentUser.CreateSubKey(Settings.Default.RegRootKey, RegistryKeyPermissionCheck.ReadWriteSubTree)));//GetMyBaseKey();

    internal static SecureString GetSecureString(string sPlain)
    {
      var ssStr = new SecureString();

      if (string.IsNullOrEmpty(sPlain) == false)
      {
        foreach (var t in sPlain)
        {
          ssStr.AppendChar(t);
        }
      }
      return (ssStr);
    }

    public static RegistryPreset LoadPreset(string sPresetName)
    {
      Debug.Assert(sPresetName != null, "sPresetName != null");
      sPresetName = sPresetName.Trim();
      RegistryPreset rpNewEntry = null;

      try
      {
        var rkPreset = rkPresetsRoot.OpenSubKey(sPresetName);

        if (rkPreset != null)
        {
          rpNewEntry = new RegistryPreset(rkPreset);

        }
      }
      catch
      {
        rpNewEntry = null;
      }

      return (rpNewEntry);
    }

    public bool SavePreset(string sPresetName)
    {
      Debug.Assert(sPresetName != null, "sPresetName != null");
      sPresetName = sPresetName.Trim();
      var bResult = false;

      try
      {
        var rkPreset = (rkPresetsRoot.OpenSubKey(sPresetName) ?? rkPresetsRoot.CreateSubKey(sPresetName, RegistryKeyPermissionCheck.ReadWriteSubTree));

        if (rkPreset != null)
        {
          rkPreset.SetValue(Settings.Default.ExecutableTarget, ExecutableTarget, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.Argument, Arguments, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.WorkingDirectory, WorkingDirectory, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.IconPath, IconPath, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.Description, Description, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.WindowStyle, WindowStyle, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.WindowStyle, IconIndex, RegistryValueKind.DWord);
          rkPreset.SetValue(Settings.Default.Login, Login, RegistryValueKind.String);
          rkPreset.SetValue(Settings.Default.Password, m_sPassword, RegistryValueKind.Binary);

          bResult = true;
        }
      }
      catch
      {
        bResult = false;
      }

      return (bResult);
    }

    public bool SavePreset()
    {
      if (string.IsNullOrEmpty(PresetName))
      {
        throw new ArgumentNullException(string.Format("PresetName{0}", ""), "Preset name must be provided and not empty.");
      }
      else
      {
        var bResult = false;

        try
        {
          var rkPreset = ((rkPresetsRoot.OpenSubKey(PresetName.Trim(), RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl)) ??
                          (rkPresetsRoot.CreateSubKey(PresetName.Trim(), RegistryKeyPermissionCheck.ReadWriteSubTree)));

          if (rkPreset != null)
          {
            rkPreset.SetValue(Settings.Default.ExecutableTarget, ExecutableTarget, RegistryValueKind.String);
            rkPreset.SetValue(Settings.Default.Argument, Arguments, RegistryValueKind.String);
            rkPreset.SetValue(Settings.Default.WorkingDirectory, WorkingDirectory, RegistryValueKind.String);
            rkPreset.SetValue(Settings.Default.IconPath, IconPath, RegistryValueKind.String);
            rkPreset.SetValue(Settings.Default.Description, Description, RegistryValueKind.String);
            rkPreset.SetValue(Settings.Default.WindowStyle, WindowStyle, RegistryValueKind.DWord);
            rkPreset.SetValue(Settings.Default.WindowStyle, IconIndex, RegistryValueKind.DWord);
            rkPreset.SetValue(Settings.Default.Login, Login, RegistryValueKind.String);
            rkPreset.SetValue(Settings.Default.Password, Password, RegistryValueKind.String);

            rkPreset.Flush();
            rkPreset.Close();

            bResult = true;
          }
        }
        catch (Exception)
        {
          bResult = false;
        }

        return (bResult);
      }
    }

    public void Run()
    {
      var psiTheApp = new ProcessStartInfo(m_sExecutableTarget, m_sArguments)
      {
        ErrorDialog = true,
        LoadUserProfile = false,
        UseShellExecute = false
      };


      if (String.IsNullOrEmpty(m_sLogin) == false)
      {
        var sTmpLogin = string.Empty;

        try
        {
          sTmpLogin = m_sLogin.Split(@"\".ToCharArray())[1];
        }
        catch
        {
          try
          {
            sTmpLogin = m_sLogin.Split("@".ToCharArray())[0];
          }
          catch (Exception)
          {
            MessageBox.Show("Invalid user login name.\r\n" +
                            "Please call your System Administrator for help.\r\n" +
                            "\r\n" +
                            "Application is closing.", "Error",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error,
                            MessageBoxDefaultButton.Button1,
                            MessageBoxOptions.DefaultDesktopOnly);
          }
        }

        psiTheApp.UserName = String.Format(Settings.Default.UserLoginFormat, sTmpLogin);
        psiTheApp.Password = GetSecureString(Password);
      }
      else
      {
        throw new ArgumentException("Login name is empty!");
      }

      try
      {
        using (var prc = Process.Start(psiTheApp))
        {
          prc.Dispose();
        }
      }
      catch (Exception ex)
      {
        throw new Exception(ex.Message, ex);
      }
    }

    public static RegistryPreset LoadAndRun(string sPresetName)
    {
      var prTemp = LoadPreset(sPresetName);

      if (prTemp == null)
      {
        throw new Exception(string.Format(csMessage, sPresetName));
      }
      else
      {
        prTemp.Run();
      }
      return (prTemp);
    }

    internal static string m_sPresetName;

    public string PresetName
    {
      get { return (m_sPresetName); }
      set { m_sPresetName = ((value != null) ? (value.Trim()) : (null)); }
    }

    internal static string m_sExecutableTarget;

    public string ExecutableTarget
    {
      get { return (m_sExecutableTarget); }
      set { m_sExecutableTarget = value; }
    }

    internal static string m_sArguments;

    public string Arguments
    {
      get { return (m_sArguments); }
      set { m_sArguments = value; }
    }

    internal static string m_sPassword;

    public string Password
    {
      get { return m_sPassword; }
      set { m_sPassword = value; }
    }

    internal static string m_sLogin;

    public string Login
    {
      get { return (m_sLogin); }
      set { m_sLogin = value; }
    }

    internal string m_sWorkingDirectory;

    public string WorkingDirectory
    {
      get { return (m_sWorkingDirectory); }
      set { m_sWorkingDirectory = value; }
    }

    internal string m_sIconPath;

    public string IconPath
    {
      get { return (m_sIconPath); }
      set { m_sIconPath = value; }
    }

    internal string m_sDescription;

    public string Description
    {
      get { return (m_sDescription); }
      set { m_sDescription = value; }
    }

    internal ProcessWindowStyle? m_pwsWindowStyle;

    public ProcessWindowStyle? WindowStyle
    {
      get { return (m_pwsWindowStyle); }
      set { m_pwsWindowStyle = value; }
    }

    internal int? m_iIconIndex;

    public int? IconIndex
    {
      get { return (m_iIconIndex); }
      set { m_iIconIndex = value; }
    }

    public RegistryPreset(RegistryKey rkFromRegKey)
    {
      m_sPresetName = rkFromRegKey.Name.Split(@"\".ToCharArray())[rkFromRegKey.Name.Split(@"\".ToCharArray()).Length - 1];
      m_sExecutableTarget = rkFromRegKey.GetValue(Settings.Default.ExecutableTarget).ToString();
      m_sArguments = rkFromRegKey.GetValue(Settings.Default.Argument).ToString();
      m_sLogin = rkFromRegKey.GetValue(Settings.Default.Login).ToString();
      m_sPassword = rkFromRegKey.GetValue(Settings.Default.Password).ToString();

      m_sWorkingDirectory = rkFromRegKey.GetValue(Settings.Default.WorkingDirectory).ToString();
      m_sIconPath = rkFromRegKey.GetValue(Settings.Default.IconPath).ToString();
      m_sDescription = rkFromRegKey.GetValue(Settings.Default.Description).ToString();
      m_pwsWindowStyle = (ProcessWindowStyle)rkFromRegKey.GetValue(Settings.Default.WindowStyle);
      m_iIconIndex = (int)rkFromRegKey.GetValue(Settings.Default.IconIndex);
    }
  }
}

推荐答案

据我所知,您正在使用static属性和方法,请尝试将其删除.

foreach中,您正在创建一个rp,但没有使用它.
As far as I can tell you are using static properties and methods, try removing them.

And in the foreach you are creating a rp but not using it.


这篇关于新的类构造函数-不构造...的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆