新的类构造函数-不构造... [英] New class constructor - not constructing...
问题描述
大家好.
首先,我删除了上一个问题,因为我发现它与函数或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 usingstatic
properties and methods, try removing them.
And in theforeach
you are creating arp
but not using it.
这篇关于新的类构造函数-不构造...的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!