Nelze přistoupit do registru ve W7 64bit   zodpovězená otázka

VB.NET

Zdravím,

mám dotaz. Mám aplikaci která na W7 x86 běhá bez problému a na stroji W7 x64 padá aplikace na chybu "Odkaz na objekt není nastaven na instanci objektu". Problém je že na tomto stroji nemám VS takže nemůžu ladit ale pomocí PC kde VS mám a postupným umísťováním msgbox abych veděl kde program klekne jsem přišel na to že je to při přístupu do registru pomocí (teď to z hlavy přesně nevím) my.computer.registry (nebo jak to je).

Nastavil jsem při přístupu k registru i že chcí číst/zapisovat a fullcontrol ale i přesto to nefunguje, ale na x86 stanici ten samý kód jede bez problému. Nevíte kde by mohl být problém? Na obou PC je UAC vypnuto.

Předem díky za rady

Martin

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak bez zdrojového kódu vám asi těžko někdo poradí. Jedna z věcí na kterých záleží je, zda-li je aplikace přeložena nezávisle na architektuře, 32-bitově nebo 64-bitově. Také doufám, že nemáte ty cesty do registru zadané napevno.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

projekt se kóduje do x86 a cestu mám pomocí my.computer.registry.localmachine.opensubkey(vetev, subtreereadwrite, fullcontrol).getvalue("hodnota", "")

Pisu to z hlavy ale u tohoto kódu vzniká chyba ukládám to do stringu

Přesný kód dám večer teď nejsem doma

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže tady jé kód nefunguje ani zápis ani čtení je to stejné:

Zápis:

My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.FullControl).SetValue("Program", Application.ExecutablePath & " /hide")

čtení:

dim Verze as string = My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Můj program\Info", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.FullControl).GetValue("ProductVersion", "")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě se mi podařilo zjistit že to hlásí

System.NullReferenceException

Udělal jsem prázdnou applikaci kde je pouze jeden řádek kódu a to čtení z registru a při tom to prostě spadne.

Mám WinForm applikaci s vypnutým frameworkem abych mohl startovat ze Sub Main.

Applikace je ve framework 2.0

V projektu mám nastaven cílový procesor x86

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Rozhodně změňte Target CPU na Any CPU (vlastnosti projektu/Compile/Advanced Compile Options...), pokud k tomu není rozumný důvod, nemá cenu kompilovat do x86 nebo x64.

Pokud se totiž 32-bitová aplikace v 64-bitovém systému dotáže na hodnotu z klíče HKEY_LOCAL_MACHINE\SOFTWARE\<Něco>, systém přesměruje dotaz na klíč HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\<Něco>, Wow6432Node odděluje nastavení 32-bitových aplikací od 64-bitových. Proto vám to vrací Nothing, protože ten klíč neexistuje.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

problém je v tom že v programu používám knihovnu která pod 64bit nefunguje tak jsem to chtěl zkusit tak že bych projekt udělal pro x86

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě nejdříve ověřte, zda-li větev a klíč existují a teprve potom do nich zapisujte/čtěte. Vytvořit je můžete buď programově, nebo instalátorem (což bude mít výhodu že se po odinstalaci odstraní i hodnoty z registru pokud je to žádoucí).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Hodnota existuje to vím jistě ale mě nejde ani zapisovat viz kód nahoře při tom to spadne taky. Čtená hodnota je z cizího programu. Jak ji tedy přečíst při zachování procesoru x86

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučuji použít jednodušší variantu metody OpenSubKey a klíč si uložit do proměnné, potom bude hned vidět jestli je klíč Nothing nebo nějaká existující hodnota. Pokud to hlásí NullReferenceException, je jasné že to způsobilo volání metody SetValue na prázdné (Nothing) proměnné, jinak řečeno klíč neexistuje nebo došlo k vyjímce ohledně zabezpečení.

Dim subKey = My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
If subKey IsNot Nothing Then
  subKey.SetValue("Program", Application.ExecutablePath & " /hide")
End If
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

jenže na pc kde mám studio mi to jde a na pc kde není to nejde takže krokovat nelze. Ten váš kód zkusím

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak použijte vzdálené ladění, nebo si zapisujte vyjímky do souboru. Používat MsgBox pro ladění je ten nejhorší možný způsob.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Vzdálené ladění? Jak na to nic mi to neřiká

proč je msgbox nevhodný? Když dojde k chybě tak si vypíšu hlášení přijde mi to stejný jako kdybych to zapisoval do souboru

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě podotknu že druhý počítač kde to nefunguje je úplně v jiné síti v jiném městě

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vzdálené ladění je ladění aplikace běžící na vzdáleném počítači. Pokud není ve stejné síti, dá se realizovat pomocí VPN. Nepodporuje to Express a Standard verze Visual Studia. Ladit pomocí MsgBoxu je naprostá zhovadělost, protože to vyžaduje interakci uživatele, tím pádem přerušení činnosti programu a nejsou k dispozici podrobné ladící informace (Stack Trace) pro pozdější analýzu. Visual Basic umožňuje zápis do protokolu událostí pomocí My.Application.Log, který lze konfigurovat v konfiguračním souboru aplikace, samotný Framework má podporu pro logování pokud chcete implementovat vlastní systém logování a rovněž existují profesionální logovací frameworky třetích stran.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže skutečně je problém v tom že při přepnutí aplikace pro x86 cpu se to v registru odkazuje na HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Neco

A teď je nějaký způsob jak se i přes to dostat k původnímu klíči

HKEY_LOCAL_MACHINE\SOFTWARE\Neco ???

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vy to nechápete nebo co? Vysvětloval jsem vám, že 32-bitové aplikace jsou vždy přesměrovány do Wow6432Node. Pokud chcete přímý přístup do HKEY_LOCAL_MACHINE\SOFTWARE, musíte použít 64-bitovou aplikaci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chápu to ale myslel jsem jestli neexistuje nějaký způsob jak to obejít?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

K čemu by to bylo? Potom by to zase nefungovalo na 32-bitovém systému kde větev Wow6432Node není. Prostě to berte jako fakt a počítejte s tím při vývoji.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK moc děkuji za pomoc holt musím najít jinou cestu jak problém vyřešit a aplikaci rozjet na 64bitech :c(

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback