Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Binääritedostoon kirjoitus VB5:llä

Sivun loppuun

setä [27.01.2022 22:13:29]

#

Vieläkö saa apuja VB6:een tau oikeastaan VB5:een. Olen koodannut useita ohjelmia VB5:llä mutta eräästä on designversio hukassa ja ohjelma ei näytä enää toimivan. Kyse on binääritiedostoon kirjoituksesta. Tiedostossa on Hexaeditorin mukaan 2 tavua ilmaisten merkkijonon pituuden ja sen jälkeen merkkijono. Näitä peräkkäin, joka toinen salattu. En löydä menetelmää jolla olen tiedoston joskus luonut. Mystistä on se että ohjelma toimi vielä muutama päivä sitten mutta ei enää. Tiedosto ei muutu vaikka lisään sinne jotain tai muutan jotain. Käsipelillä pystyn jotain muuttamaan mutta se ei tule kysymykseen.

Grez [27.01.2022 22:21:02]

#

Jopas, no vastataan ainoaan kysymykseen:

setä kirjoitti:

Vieläkö saa apuja VB6:een tau oikeastaan VB5:een.

Kyllä täällä varmasti vielä on monia jotka osaa VB6 ja VB5 ja pystyvät auttamaan.

Sinänsähän jos kerran lähdekoodi on hukassa eikä käännetty toimi, niin vaihtoehdot on lienee käyttää jotain ohjelmaa joka pyrkii palauttamaan koodia alkuperäiseksi tai sitten ihan mahdollista koodata koko ohjelma alusta ja tällöin ei tietty ole pakko rajoittua vb:hen.

Yksi mahdollisuus saada ohjelma toimimaan olisi ehkä myös asentaa (mahdollisesti vanhempi) Windows jollekin koneelle tai virtuaalikoneelle ja koittaa ajaa softaa siinä.

setä [27.01.2022 23:07:07]

#

Olen hakenut apuja netistä ja viimein päädyin tänne Ohjelmointiputkaan. Muinoin olen saanut apuja Laaksosen Antilta (onko nimi oikein?).
Kyse on pikkuohjelmasta jonka tiedosto liittyy laajempaan ohjelmaan (sukuohjelma).
Lähdekoodi olisi kyllä hienoa saada näkyviin. Luulin kokeilemalla selvittäväni ongelman mutta ei onnistu. Kun kirjoitan testiohjelmalla Put-käskyllä tiedostoon testi.bin niin jostain syystä toisen merkkijonon pituus kirjoittuu tiedoston ensimmäisiksi tavuiksi ja arvo on 2 liian suuri. Alkuperäisessä tiedostossa on pituus (2 tavua) ja merkkijono, seuraava pituus ja merkkijono jne.

setä [27.01.2022 23:28:01]

#

Minulla on läppäri jossa Win 7. Pöytäkoneessa on Win 10. Molemmissa on sukuohjelman 2 versiota, SukuC jolla voi vain katsella sukuun kuuluvien henkilöiden tietoja ja kuvia. SukuB on laajempi ja sillä voi päivittää tietoja, ohjelmaa ja ohjetta. Serverin kautta tietoja jaetaan käyttäjille. Pikku ohjelma mikä liittyy näihin molempiin sukuohjelmaversioihin, on käyttäjien tunnuksia ja salasanoja varten. SukuB toimii Win 10:ssä mutta ei SukuC. Enää se ei näytä toimivan Win 7:kään.
Sääli että tuki Visual Basicille on lopetettu. Minusta se on helppo ohjelmointikieli ja nopeat ohjelmat.

setä [28.01.2022 14:39:50]

#

Kokeilin myös Win7:llä. Kirjoittaa jostain syystä enismmäsiksi kahdeksi tavuksi asciikoodit 8 0, seuraavaksi merkkijonon pituuden esim. 7 0 ja merkkijonon "ktunnus". Seuraava merkkijono tulee välittömästi edellisen perään. Pitäisi toimia niin, että jokaisen merkkijonon edelle tulee 2 tavua mitkä ilmasevat sen pituuden.

Grez [28.01.2022 17:48:33]

#

Mä luulen että jos laittaisit jotain konkreettisia kysymyksiä tai esimerkkejä (koodeineen), joissa mielestäsi joku toimii toisin kuin olet odottanut, niin muilla olisi huomattavasti helpompaa auttaa sinua.

setä [28.01.2022 19:51:38]

#

Option Explicit
Dim fl, s, ph As String
Dim k, i, n As Integer, a As String * 2
Dim kt, pw As String

Private Sub Form_Load()
  ph = App.Path & "\"
  fl = "testi.bin"
  Kill ph & fl


Open ph & fl For Binary As 1
    For i = 1 To 5
      kt = Left$("abcdefghijklmn", 6 + 8 * Rnd)
      n = LOF(1) + 1
      Put #1, n, kt
      DoEvents
    Next
  Close
  Open ph & fl For Binary As 1
    s = input(LOF(1), #1)
    Debug.Print s, Len(s)
  Close
  End
End Sub

Kokeilin koodia mutta ei onnistunut. Siinä on testiohjelma.
Tulos on seuraava:

� � abcdefghijkl�
 abcdefghij� � abcdefghijk� � abcdefgh� � abcdefgh       69

Ilmeisesti ei saa kuvaa tähän.
Hexeditorilla näkyy chr$(8) jokaisen merkkijonon edessa ja sen jälkeen kaksi tavua jotka ilmisevat merkkijonon pituuden.
Esimmäisen merkkijonon edessä on siis 08 00 0C 00, seuraavan 08 00 0A 00

Grez [28.01.2022 20:06:28]

#

Eikös toi siis toimi ihan odotetusti. kt on tyypiltään variant, joten sen kirjoittamiseen tulee ensin kaksi tavua joka kertoo mikä tiedon tyyppi on (08 00 => Merkkijono) ja sitten merkkijonon tapauksessa pituus esim 0c 00 => 12 merkkiä.

Eli jos määrittelet:

setä kirjoitti:

Dim kt, pw As String

Se tarkoittaa samaa kuin

Dim kt As Variant, pw As String

Saattaa olla, että haluaisit määritellä:

Dim kt As String, pw As String

setä [28.01.2022 20:09:07]

#

Jäi kommentit pois
Kill on vain tarvittaessa. Jos tiedotoa ei tyhjätä, LOF(1) ilmaisee sen hetkisen tiedoston pituuden.
Input-käsky ei toimi ellei tiedostoa välillä sulje.

setä [28.01.2022 20:27:49]

#

Jos määrittelen kt:n stringiksi, ei tule mitään tavuja merkkijonon eteen.
Alkuperäisessä tiedostossa on vain 2 tavua jokasen merkkijonon edessä mitkä ilmasevat sen pituuden. Siis tavuja 08 00 ei ole lainkaan. Miten se on mahdollista?

Grez [28.01.2022 20:28:29]

#

setä kirjoitti:

Input-käsky ei toimi ellei tiedostoa välillä sulje.

Miksei toimisi? Ihan hyvin toimii ainakin minulla, mutta tietysti kannattaa siirtää kursori tiedoston alkuun jos meinaa saada luettua alusta:

'...
      Next
      Seek 1, 1
      s = Input(LOF(1), #1)
'...

setä [28.01.2022 20:30:14]

#

Kiitos, Ok !

setä [28.01.2022 20:31:12]

#

Mitä koodia käytit että sait värit näkyviin?

Grez [28.01.2022 20:32:07]

#

Jos haluat pelkän pituuden ja merkkijonon, niin sen voi toki kirjoittaa:

Dim fl, s, ph As String
Dim k, i, n As Integer, a As String * 2
Dim kt As String, pw As String
ph = App.Path & "\"
fl = "testi.bin"
Kill ph & fl

Open ph & fl For Binary As #1
  For i = 1 To 5
    kt = Left$("abcdefghijklmn", 6 + 8 * Rnd)
    n = Len(kt)
    Put #1, , n
    Put #1, , kt
    DoEvents
  Next
  Seek 1, 1
  s = Input(LOF(1), #1)
  Debug.Print s, Len(s)
Close
End

setä kirjoitti:

Mitä koodia käytit että sait värit näkyviin?

Valitsin tuosta alasvetovalikosta kooditagin VB6 / VBA:lle, jolloin tagi on muotoa |koodi VB| (jossa tietty | korvataan hakasuluilla)

setä [28.01.2022 21:47:03]

#

Nyt alkaa valjeta! Hyvä. Luulin osaavani Visual Basicia mutta muisti onaika huono eikä helpit toimi enää.

Option Explicit
Dim fl, s, ph As String
Dim k, i, n As Integer
Dim kt As String, pw As String

Private Sub Form_Load()
  ph = App.Path & "\"
  fl = "testi.bin"

  Open ph & fl For Binary As 1
    For i = 1 To 5
      kt = Left$("abcdefghijklmn", 6 + 8 * Rnd)
      n = Len(kt)
      Put #1, , n
      Put #1, , kt
      pw = Left$("12345678901234", 6 + 8 * Rnd)
      n = Len(pw)
      Put #1, , n
      Put #1, , PV
    Next
    Seek 1, 1
    s = input(LOF(1), #1)
    Debug.Print s, Len(s)
  Close
  End
End Sub

setä [29.01.2022 08:32:41]

#

Grezille suuret kiitokset! Ilman tuon Dim-määrittelyn korjausta en saanut lainkaan ohjelmaa toimimaan oikein. Luulin että määrittelyllä:

Din kt, pw as string

Molemmat muuttujat ovat stringejä. Täytyy vielä opiskella Dim-määrittelyä. Onko siis aina ilman tyyppimääritystä muuttujan tyyppi Variant. Kuvittelin että rivin lopussa ollut määritys kopioituu kaikille Dim-lauseessa oleville muuttujille.

Grez [29.01.2022 09:49:17]

#

Kyllä, jos määrittelet muuttujan Dimillä, mutta et kerro minkä tyypin haluat, se saa tyypiksi variant.

Näissähän ei tarvi arvailla mitä tapahtuu. Ainakin Excelin VBA:ssa, editori kertoo mikä muuttujan tietotyyppi on, kun menet hiirellä muuttujan päälle. En jaksanut asentaa VB6:sta, mutta luulisin että siinäkin toimii samoin.

Koodauksessa on mielestäni vähän tyhmää olettaa, kun pystyy helposti tarkistamaan.

setä [29.01.2022 12:58:08]

#

Jossain näin dim-lauseessa erotetun pilkulla muuttujia ja vain viimeisen tyyppi oli määrätty. Ajattelin vain että noinhan se käy lyhyemmin.
VB5:ssä näyttää vain Emptyä jos ei ole tyyppiä määritelty. Jos on, näyttää 0 tai tyhjä eli "". En tiedä VB5:ssä miten tyypin saa selville katsomatta miten ne on määritelty. Määrittelemätön näyttää olevan Variant tyyppiä koska hyväksyy useat tyypit.

Grez [29.01.2022 13:11:50]

#

Hmm, taisin nähdä unta. Ei tuo excelinkään VBA editori näköjään näytä muuttujan tyyppiä vaan sen arvon jos menee hiirellä päälle. Olen vissiin liian tottunut uudenaikaisempiin työkaluihin...

Watch -ikkunassa sentään näkyy tyyppinä esim. Variant/String jos tietotyyppi on variant ja sen sisältö on merkkijono. TypeName tai VarType -funktiot ei näyttäneet suoraan auttavan sen selvittämisessä onko kyseessä Variant vai ei.

Asian voi toki päätellä mutkan kautta siitä, että muuttujan tietotyyppi vaihtuu:

Dim kt, pw As String
Dim i As Integer

kt = "Teksti"
pw = "Teksti"

For i = 1 To 2
    Debug.Print "kt", kt, TypeName(kt)
    Debug.Print "pw", pw, TypeName(pw)
    kt = i
    pw = i
Next

Tulos:

kt            Teksti        String
pw            Teksti        String
kt             1            Integer
pw            1             String

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta