Problém s INI   zodpovězená otázka

VB.NET

Četl jsem zde téma o INI a zkoušel jsem úpravy,ale nepomohlo to.

Problém je následující ve VB (2005 ale ted jsem to převedl pod VB 2008).

Mám nastavený zápis a čtení INI souboru. Při snaze zapsat nebo číst z INI souboru mi hází chybu s přístupem do chráněné pamětí. Nevíte jak se to opravit nebo co by to mohlo způsobit? Na začátku když jsem to začal používat to běhalo bez problému.

zde kontroluji hodnoty. pokud nejsou tak je ma načíst z INI

If SERVER1 Is Nothing Or SERVER1 = "" Then
            ' RtoINIserver(SERVER1, DATABASE1, PREFIX1, UID1, PASS1, names_char1)
            Form2.ShowDialog()
        End If

zapis a čtení INI mam takto.

Module Module2
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal lpFileName As String) As Long

    Function WtoINIm()
        WritePrivateProfileString("M", "Adresar", "c:\B\", "c:\B\m.ini")
    End Function

    Function WtoINIserver(ByVal SERVER1, ByVal DATABASE1, ByVal PREFIX1, ByVal UID1, ByVal PASS1, ByVal names_char1)
        WritePrivateProfileString("SERVER", "Server1", SERVER1, "c:\B\m.ini")
        WritePrivateProfileString("SERVER", "Databaze", DATABASE1, "c:\B\m.ini")
        WritePrivateProfileString("SERVER", "Prefix", PREFIX1, "c:\B\m.ini")
        WritePrivateProfileString("SERVER", "Jmeno", UID1, "c:\B\m.ini")
        WritePrivateProfileString("SERVER", "Heslo", PASS1, "c:\B\m.ini")
        WritePrivateProfileString("SERVER", "ZnakSada", names_char1, "c:\B\m.ini")
    End Function
    Function RtoINIserver(ByVal SERVER1 As String, ByVal DATABASE1 As String, ByVal PREFIX1 As String, ByVal UID1 As String, ByVal PASS1 As String, ByVal names_char1 As String)
        GetPrivateProfileString("SERVER", "Server1", "", SERVER1, "c:\B\m.ini")
        GetPrivateProfileString("SERVER", "Databaze", "", DATABASE1, "c:\B\m.ini")
        GetPrivateProfileString("SERVER", "Prefix", "", PREFIX1, "c:\B\m.ini")
        GetPrivateProfileString("SERVER", "Jmeno", "", UID1, "c:\B\m.ini")
        GetPrivateProfileString("SERVER", "Heslo", "", PASS1, "c:\B\m.ini")
        GetPrivateProfileString("SERVER", "ZnakSada", "", names_char1, "c:\B\m.ini")
    End Function
End Module

Kdyby jste mohli poradit jak to udělat, protože mne nic nenapadá proč to hazí takovou chybu.

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

S chybami s pamětí jsem si taky užil svoje a nikdy jsem nepřišel na to proč mi vznikali, proto jsem po čase vždycky rezignoval. Nemám pro Vás sice konstruktivní řešení, ale rád bych na Vás apeloval, abyste použil XML soubor, pokud je to možné (INI si vytváříte sám). řeji štěstí při řešení problému!

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

ono je to v podstatě jedno kde to bude uložené. Já potřebuji někam uložit nastavení aplikace aby uživatel když si ji otevře, nemusel opět zadávat údaje. A já mohl bez problému přistupovat k tomuto souboru a dávat do něj další nastavení. Tak aby se s tím dalo dobře dělat.

Právě proto jsem zvolil INI soubor, protože je to přehledné atd., ale ta paměť mne teda dost dostala. už jsem prošel asi kde co a na důvod jsem nepřišel. ze začátku mi to chodilo bez problému. řekl bych že to má něco společné s chybou manifest, ale přesně co a proč nevím.

a s tím XML to myslíte jak? vytvořit xml soubor a pak jej zase načíst? jde o to že aplikace do toho souboru bude přistupovat dost často.

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

Ta na tohle jsem malá páka, to nerozlousknu, ale podle Vašeho popisu se zdá ideální řešení My.Settings. Zkuste si to proklepnout, je to velice šikovné.

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

tak jsem to hned zkusil s tim My.Settings a je to bezva náhrada. Já teda s XML dělám dost často import/export ale tohle mi po pravdě uteklo. Vždyť VB dělá s XML všude. To je tak když člověk je zabraný do něčeho a nekouká. Díky za nasměrování.

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

Jste ve VB 6 nebo ve VB.NET? Téma máte sice zařazeno v kategorii Visual Basic 6, ale zaráží mě, že všude v deklaracích funkcí máte ByVal, což není pro VB6 typické, a zároveň deklarace Module a End Module pokud si dobře pamatuji ve VB6 nebyla (možná se pletu, ve VB6 jsem dělal před pěti lety).

Pokud jste ve VB.NET, máte chybu v deklaraci těch API funkcí, na řádcích začínajících Private Declare změňte Long za Integer. Ve starém VB6 totiž Long měl 4 bajty, zatímco ve VB.NET má 4 bajty Integer a Long má bajtů 8.

Pokud jste ve VB6, pak se podívejte na deklarace těch funkcí a pořádně zkontrolujte, jestli jsou správně. Evidentně tam nesedí nějaké bajty, zkontrolujte, jestli funkce mají správný počet parametrů.

A jinak doporučuji všude deklarovat datové typy, někde na to zapomínáte.

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

je to dělané ve VB2005. Ale teď jsem přešel na VB2008. Ten kód ale fungoval a chodilo bez problému. Pak došlo ke změně něčeho a od té doby to dělá paseku. Už jsem to ale vyřešil jinak. Cele INI jsem poslal k šípku a využil systémové věci VB (XML My.Settings).

Díky za radu.

Ikdyž mne pořád zajímá jak mohlo a hlavně proč to dělá paseku.

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

Vždyť jsem vám to vysvětloval, ve VB6 tohle fungovat bude, ale když tu deklaraci zkopírujete do nového Visual Basicu .NET, tak tam má datový typ Long 8 bajtů, a tedy při vytahování výsledku funkce se vezme víc bajtů, než skutečně vrátí, a pak se v paměti všechno posune a aplikace spadne.

Použít My.Settings je samozřejmě daleko lepší, protože se dají rozlišit nastavení společná pro celou aplikaci od nastavení pro každého konkrétního uživatele. A navíc je s tím méně práce.

nahlásit spamnahlásit spam 2 / 2 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