2015-11-09 62 views
0

我正在開發x86應用程序以將自建的「編程語言」轉換爲彙編程序。在某些時候,我需要獲得MASM32的路徑。我已經閱讀了幾個相關的主題,但他們沒有幫助我,也許是因爲我是C#的新手。 MASM32位於此處:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MASM32。 當我運行我的程序時,我總是收到「找不到Masm32」消息。 我該怎麼辦?提前致謝!爲什麼OpenSubKey()在我的Windows 10 64位系統上返回null?

WindowsIdentity ident = WindowsIdentity.GetCurrent(); 
     WindowsPrincipal myPrincipal = new WindowsPrincipal(ident); 
     if (!myPrincipal.IsInRole(WindowsBuiltInRole.Administrator)) 
     { 
      string user = Environment.UserDomainName + "\\" + Environment.UserName; 
      RegistrySecurity rs = new RegistrySecurity(); 
      rs.AddAccessRule(new RegistryAccessRule(user, 
         RegistryRights.ReadKey | RegistryRights.Delete | RegistryRights.CreateSubKey | RegistryRights.WriteKey | RegistryRights.ChangePermissions | RegistryRights.SetValue, 
         InheritanceFlags.None, 
         PropagationFlags.None, 
         AccessControlType.Deny)); 
     } 
     try 
     { 
      RegistryKey baseKey = RegistryKey.OpenBaseKey(
      RegistryHive.LocalMachine, 
      RegistryView.Registry64); 
      RegistryKey key = baseKey.OpenSubKey(@"SOFTWARE\Wow6432Node\"); 
      PathMasm32 = baseKey.GetValue("MASM32").ToString(); 
     } 
     catch { 
      erTxt = "Masm32 is not found"; 
       } 
+1

'「MASM32沒有找到」'是*你的*錯誤信息。它會在出現任何問題時返回。 – Plutonix

+3

不要在沒有異常的情況下使用'catch',否則你會拋棄所有的問題細節。 –

+1

什麼是實際例外? –

回答

-1

這可能不是OpenSubKey()是導致空引用異常,但baseKey.GetValue().ToString()電話。 baseKey.GetValue()返回null(因爲在這種情況下,您試圖在HKEY_LOCAL_MACHINE根節點下正確獲取值),並且您在空引用上調用ToString()。而不是baseKey.GetValue(),你應該嘗試key.GetValue(),假設MASM32真的是HKLM\SOFTWARE\Wow6432Node下的值,這是極不可能的。

key.GetValue("MASM32").ToString(); 

安全注意:如果你正在尋找MASM32的安裝路徑,即使我沒有在任何的專業知識,他們明確指出The MASM32 SDK is registry safe and writes nothing to the registry.

因此,MASM32可能是一個KEY不是價值,因此請執行此方法並打印它的輸出,你會看到MASM32項下注冊的鍵/值對假設它存在於註冊表路徑HKLM\SOFTWARE\Wow6432Node\MASM32

public static string GetMASM32LocationFromRegistry() 
{ 
    RegistryKey localMachineRegistryKey; 
    RegistryKey masm32RegistryKey; 
    RegistryView currentRegistryView = RegistryView.Registry64; 

    localMachineRegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, currentRegistryView); 
    masm32RegistryKey = localMachineRegistryKey.OpenSubKey(@"SOFTWARE\Wow6432Node\MASM32"); 

    if (masm32RegistryKey == null) 
    { 
     return @"ERROR: The registry key HKLM\SOFTWARE\Wow6432Node\MASM32 could not be found"; 
    } 

    StringBuilder masm32RegistryKeyValuesBuilder = new StringBuilder("Key/Value pairs for registry key HKLM\\SOFTWARE\\Wow6432Node\\MASM32:\r\n"); 
    foreach (string masm32RegistryKeyValueName in masm32RegistryKey.GetValueNames()) 
    { 
     masm32RegistryKeyValuesBuilder.AppendFormat 
     (
      "Key: [{0}], Value: [{1}], Value Type: [{2}]\r\n", 
      masm32RegistryKeyValueName, 
      masm32RegistryKey.GetValue(masm32RegistryKeyValueName), 
      masm32RegistryKey.GetValueKind(masm32RegistryKeyValueName) 
     ); 
    } 

    return masm32RegistryKeyValuesBuilder.ToString(); 
} 
+0

但是代碼不正確,請嘗試從打開的子鍵中刪除尾部斜槓 –

+0

您能告訴我,什麼是不正確的,以及如何使其正確? –

+0

baseKey是HKLM,您嘗試從baseKey獲取MASM32,這意味着您試圖獲取HKLM \ MASM32的值。我認爲這可能是錯誤,你應該嘗試從關鍵變量而不是baseKey變量中獲取值。你說你無法打開子鍵,對不起,應該檢查當我今晚訪問我的電腦時 –

相關問題