Hej Nick Ding, Problemet är att 0x80000024 (2147483684) är för stor för att lagras i ett signerat heltal. Ett signerat heltal kan lagra värdena på -2147483648 till 2147483647. Istället för att använda ett större heltal (t. ex. Int64 max på 9223372036854775807), använd ett unsigned heltal som är lika stor som ett signerat heltal, men placerar bitarna för att lagra endast positiva siffror, therego vi flyttar lagringsutrymmet för att tillåta värden från 0 till 4294967295. Det enklaste sättet att komma ihåg när du ska använda signerade eller osignerade siffror är att överväga om du behöver både negativa och positiva tal eller bara positiva tal när ditt värde överskrider de övre gränserna för ett signerat nummer. För närvarande utvecklar FaultTrack. Jag brukar blogga om C och. Hoppas bli en MVP senast 2013. E-post: danderson på dcomproductions dot com Redigerad av DaveAnderson 03 mars 2012 20:33 Föreslagna som svar från TSoftware Tisdag 6 mars 2012 06:04 Markerad som svar av Leo Liu - MSFT Moderator Tisdag 13 mars 2012 06:19 Unmarked som svar av Nick Ding 24 mars 2012 06:24 Omarkerad som svar av Nick Ding 24 mars 2012 06:24 lördag 03 mars 2012 8:31 PMRegistryKey. GetValue Method (String) En registreringsnyckel kan ha ett värde som inte är kopplat till något namn. När detta ovannämnda värde visas i registret, visas strängen (Standard) istället för ett namn. För att hämta det här namnet, ange antingen noll eller den tomma strängen () för namn. När GetValue-metoden hämtar expanderbara strängvärden (RegistryValueKind. ExpandString), expanderar den miljösträngar med hjälp av data från den lokala miljön. Om du vill hämta utökningsbara strängvärden från registret på en fjärrdator använder du överbelastningsmetoden GetValue (String, Object, RegistryValueOptions) för att ange att du inte vill att miljösträngar ska expanderas. Om ett värde som innehåller expandera referenser till miljövariabler har lagrats som en sträng (RegistryValueKind. String), snarare än som en utvidgbar sträng (RegistryValueKind. ExpandString), utvidgar GetValue inte den. Du kan expandera en sådan sträng efter att den har hämtats genom att anropa metoden ExpandEnvironmentVariables. Det rekommenderade sättet att hämta data från PerformanceData-nyckeln är att använda PerformanceCounter-klassen i stället för RegistryKey. GetValue-metoden. GetValue stöder inte läsvärden för typen REGNONE eller REGLINK. I båda fallen returneras standardvärdet (null) istället för det faktiska värdet. Managert C: Läs och skriv registernycklar och värden Tom Archer illustrerar hur programmässigt modifiera Windows-registernycklar och värden från Managed C är mycket enklare och mer intuitivt än någonsin innan. Programmatiskt åtkomst till Windows-registret har alltid varit lite av en försvunnen uppgift. Av denna anledning har en mängd C-klasser skapats under åren för att möjliggöra enklare och mer intuitiv åtkomst till registret från Windows-program. Lyckligtvis är uppgiften att läsa och skriva registernycklar och värderingar lättare med ramverket. Denna artikel illustrerar följande vanliga registeruppgifter (Figur 1 visar MFC-demoapplikationen som levereras med den här artikeln): Figur 1: Den bifogade demoen illustrerar de vanligaste uppgifterna som involverar programmatiskt åtkomst till och modifiering av Windows-registret. Obs! Om du vill använda följande kodfragment måste du inkludera namnrymden Microsoft :: Win32 i din kod och, om du skriver en blandad applikation, avgränsa MessageBox. För att förstå hur man räknar upp en registernyckel, överväga det grundläggande exemplet på att räkna upp programvaruknappen i HKEYCURRENTUSER (HKCU). Följande är de grundläggande stegen för att utföra den här uppgiften: Instantiate ett RegistryKey-objekt med det statiska registret :: CurrentUser-värdet. Observera att du kan få tillgång till alla standardruttnycklarna (bikupor) på detta sätt. Till exempel kan du komma åt HKEYCLASSESROOT via Register :: ClassesRoot. HKEYLOCALMACHINE via registret :: LocalMachine. och så vidare. Instantiate ett RegistryKey-objekt som representerar den registernyckel som du vill arbeta med (programvarukoden, i det här fallet) via ett samtal till rotnycklarna RegistryKey :: GetSubKey-metoden. Öppna registernyckeln via ett samtal till RegistryKey :: Open-metoden. Hämta undernycklarna genom att ringa RegistryKey :: GetSubKeyNames-metoden. Denna metod returnerar en rad undernyckelnamn (i form av strängobjekt). Iterera genom den returnerade arrayen, utföra din egen applikationsspecifika logik. Stäng alla öppna RegistryKey-objekt via ett samtal till respektive Nära metoder. Processen för att räkna upp ett registernyckelvärde är nästan identiskt med att räkna upp nycklar med följande skillnader: För att få en uppsättning registernyckelvärdenamn, ringa RegistryKey :: GetValueNames-metoden. Varje post i returfältet är en sträng som representerar värdenamnet. För att få det verkliga värdet, skickar du det namnet till RegistryKey :: GetValue-metoden: Obs! RegistryKey :: GetValue-metoden returnerar ett basobjekt som du sedan kastar till lämplig typ. Därför måste du veta exakt vilken typ du förväntar dig, eftersom det inte finns något programmatiskt sätt att bestämma värdetypen som definieras i registret (sträng, numeriskt eller binärt värde). För att skapa en ny registernyckel behöver du bara ringa RegistryKey :: CreateSubKey-metoden. Denna metod returnerar ett RegistryKey-objekt som representerar den nyskapade nyckeln. Därefter kan du skapa dessa tangentvärden via samtal till SetValue-metoden. Följande kodbit skapar en ny nyckel under HKCUSoftware-knappen som heter Min produkt och lägger till värden för beskrivning och version: Obs! Metoden CreateSubKey gör inget undantag om det misslyckas på grund av den redan befintliga undernyckeln. I stället returnerar metoden helt enkelt ett värde på null. Den här uppgiften är nästan identisk med att skapa värden. Den enda skillnaden är att eftersom nyckeln redan finns måste du öppna nyckeln (via RegistryKey :: OpenSubKey) innan du använder SetValue-metoderna (OpenSubKey-metoden kommer att återgå till null om nyckeln gör existerar inte.): C 2010 Registerläsning via RegistryKey. GetValue () orsakar abrupt kodavslutning utan att kasta ett undantag - av WP22 Upplagt av Microsoft den 28.04.2011 klockan 13:00 Tack för att du tog upp det här intressanta problemet. Vi är alltid tacksamma när kunder pekar på potentiella problem - det hjälper oss att säkerställa rammens kvalitet och driva produkten i rätt riktning. Jag hade problem med att reproducera din fråga, och jag var inte säker på en aspekt av din beskrivning. Jag förstår att du hade ett fel i denna rad: Int Value System. Convert. ToInt32 (OurHKEY. GetValue (quotMyValuequot, DefaultValue)) Den här raden innehåller 2 API-invokationer och den första frågan är förstås att verifiera vilken felaktighet det gäller. Även 8211 säger du att inget undantag är kastat. Jag är inte säker på vad du då menar med 8220breaking8221 Försvinner din process utan några symtom Inget Windows-felmeddelande, ingen Watson-dialogruta och inga felmeddelande-loggposter Om så är fallet, hur kan du veta vilken viss rad i ditt program som orsakar problemet undersök detta vidare Jag skapade först en registernyckel HKEYCURRENTUSERSoftwareBugTest med ett värde MyValue 8220Initialised String Value8221 av typen REGSZ. Jag kör sedan följande program: public static void Main (sträng unusedArgs) Int32 defaultValue 22 RegistryKey ourHKEY Registry. CurrentUser. OpenSubKey (quotSOFTWAREBugTestquot, false) försök Objekt objVal ourHKEY. GetValue (quotMyValuequot, defaultValue) Console. WriteLine (quotobjVal: quotquot, objVal) Int32 intVal System. Convert. ToInt32 (objVal) Console. WriteLine (quotintVal: quototot, intVal) äntligen vårHKEY. Close () På Framework versioner 2.0, 3.0, 3.5 och 4.0 får jag detta resultat: objVal: quotInitialized String Valuequot Unhandled Undantag: System. FormatException: Inmatningssträngen var inte i rätt format. vid System. Number. StringToNumber (String str, NumberStyles-alternativ, NumberBufferamp nummer, NumberFormatInfn parseDecimal) på System. Number. ParseInt32 (String s, NumberStyles style, NumberFormatInfo info) på System. String. System. IConvertible. ToInt32 (IFormatProvider provider) på System. Convert. ToInt32 (Object value) på Program. Main (String unusedArgs) i Program. cs Så det verkar som att registret är korrekt läst och att ett undantag kastas när man försöker konvertera läsvärdet till ett heltal. Detta skulle dock förväntas. Observera också att i din repro kod stänger du inte nyckeln om ett undantag kastas. Detta kan vara orsaken till inkonsekvent åtkomst efter felet. Prova om allt mellan OpenSubKey och key. Close i ett försök-äntligen block. Jag kommer att lösa det här felet för tillfället, men om du tycker att denna bedömning är felaktig eller om du tycker att du har ny information, var god och välj den igen eller skapa en ny. Jag hoppas det här hjälper. Greg (programvaruingenjör på basklassbibliotekets lag) Inlagd av Microsoft den 26.01.2011 kl. 22:58 Tack för att du rapporterade det här problemet. Jag kan repro det om lässträngen är numerisk. Om lässträngen inte är numerisk, går det alltid igenom en FormatExcepiton på min låda. Kan du snälla hjälpa till att bekräfta om jag gör rätt repro Det skulle uppskattas om du kunde ge oss denna information så fort som möjligt. Upplagt av Microsoft den 25.01.2011 kl. 18:59 Tack för din feedback, vi granskar för närvarande problemet du har skickat. Om problemet är brådskande, vänligen kontakta support direkt (support. microsoft)
No comments:
Post a Comment