>Erledigt< allocatememory freememory

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

>Erledigt< allocatememory freememory

Beitrag von Elektrolurch »

Hi all

Ich habe in meinem Programm zwei Proceduren die sich anscheinend behindern.
Die erste habe ich einfach übernommen.
Wenn ich sie durchlaufe erhalte ich Zeitweise beim Befehl

Code: Alles auswählen

FreeMemory(ServerUniCode)
Die Fehlermeldung ERROR Invalid memory access (read error at address 86)
Rufe ich die zweite Procedure auf, ohne vorher die 1 Procedure aufzurufen läuft sie.
Lasse ich in der ersten den Freememory Befehl weg (muß ja nicht unbedingt sein) ist der Fehler in der ersten Procedure natürlich weg, der zweite in der folgenden Procedure bleibt aber.(ERROR Invalid memory access (read error at address 86))
Daraus schließe ich, dass in der Procedure 1 wohl etwas schief läuft, was sich aber erst in der 2ten auswirkt.
Hat da jemand eine Idee dazu.
Procedure 1

Code: Alles auswählen

Procedure ErmittleShares(Netzdrive.s) 
  Protected dwEntriesRead.l, dwTotalEntries.l, *Buffer.LONG
  Protected output.s ,outputLen.l, result.l
  ServerUnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, Netzdrive, -1, 0,0)
  ServerUniCode = AllocateMemory(ServerUnicodeLen)
  UnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, Netzdrive, -1, ServerUniCode, ServerUnicodeLen)
  result = NetShareEnum_(ServerUniCode, 0, @*Buffer, #MAX_PREFERRED_LENGTH, @dwEntriesRead,@dwTotalEntries, #Null)
  If result = 0
    For i = 0 To dwEntriesRead-1
      *string.STRING = *Buffer\l
      output = Space(256)
      outputLen = WideCharToMultiByte_( #CP_ACP, 0, *string, -1, output, 256,0,0)
      If Right(output,1) = "$"
      Else
      AddGadgetItem(#CifsCombo_1, -1, output)
      ;MessageRequester("Share("+Str(i)+")", output) 
      EndIf
      *Buffer+4
    Next
    NetApiBufferFree_(*Buffer)
  Else
    Debug "SystemError:" +Str(result)
  EndIf
  FreeMemory(ServerUniCode)
EndProcedure
Procedure2

Code: Alles auswählen

Procedure Cifsinstall()
  If ReadFile(0, Ziel.s + "rc.local")
    length = Lof(0)
    *rclocal = AllocateMemory(length)
    If *rclocal
       bytes = ReadData(0, *rclocal, length)
    EndIf
    CloseFile(0)
  EndIf
EndProcedure
BYe André
Zuletzt geändert von Elektrolurch am 18.09.2009 09:02, insgesamt 1-mal geändert.
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: allocatememory freememory

Beitrag von ts-soft »

Der allokierte Speicher wird wohl zu klein sein für die API.
Da diese API eigentlich nicht erforderlich ist, versuche es doch
einfach mit PB. StringByteLength, Peek und Poke sollten es auch
tun :)

Gruß

Thomas

// edit
zur Verdeutlichung:

Code: Alles auswählen

Define.s NetzDrive
Define.i ServerUnicodeLen = StringByteLength(NetzDrive, #PB_Unicode) + 2 ; Nullbyte für Unicode
Define *ServerUniCode = AllocateMemory(ServerUnicodeLen)

PokeS(*ServerUniCode, NetzDrive, -1, #PB_Unicode)
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: allocatememory freememory

Beitrag von Elektrolurch »

Hi Thomas
Danke erst mal für die schnelle Antwort.
Das wird leider etwas too much für mich sein, da ich mir die Procedure nur eingebaut habe,was da im einzelnen passiert weiß ich leider nicht. Da ich ja noch relativer Neuling und Ubootprogrammierer bin, reicht es mir normal wenn sie ihren Dienst tut.

Ich will ja nicht sagen, schreib mir das Ding um, aber ohne ein paar weitere Eklärungen werde ich mir wohl die Zähne ausbeißen.

BYe Andre
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: allocatememory freememory

Beitrag von ts-soft »

Die 3 Zeilen, die Weg müssen und durch meine ersetzt, wirste wohl finden :D
Ich hab ja sogar die Variablennamen Deiner Procedure übernommen, die deklaration
anpassen und austauschen sollte ein UnterseeUbootprogrammierer schaffen :lol:

Gruß
Thomas
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: allocatememory freememory

Beitrag von Elektrolurch »

Hi Thomas

Ich denke ich habe es hinbekommen.

Es lief zumindest zweimal ohne Störung.
Es hatte noch zwei mal das * vor ServerUniCode gefehlt.

Code: Alles auswählen

Procedure ErmittleShares(Netzdrive.s) 
  Protected dwEntriesRead.l, dwTotalEntries.l, *Buffer.LONG
  Protected output.s ,outputLen.l, result.l
  Define.s Netzdrive
  Define.i ServerUnicodeLen = StringByteLength(Netzdrive, #PB_Unicode) + 2 ; Nullbyte für Unicode
  Define *ServerUniCode = AllocateMemory(ServerUnicodeLen)
  ;ServerUnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, Netzdrive, -1, 0,0)
  ;ServerUniCode = AllocateMemory(ServerUnicodeLen)
  PokeS(*ServerUniCode, Netzdrive, -1, #PB_Unicode)
  UnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, Netzdrive, -1, *ServerUniCode, ServerUnicodeLen)
  result = NetShareEnum_(*ServerUniCode, 0, @*Buffer, #MAX_PREFERRED_LENGTH, @dwEntriesRead,@dwTotalEntries, #Null)
  If result = 0
    For i = 0 To dwEntriesRead-1
      *string.STRING = *Buffer\l
      output = Space(256)
      outputLen = WideCharToMultiByte_( #CP_ACP, 0, *string, -1, output, 256,0,0)
      If Right(output,1) = "$"
      Else
      AddGadgetItem(#CifsCombo_1, -1, output)
      ;MessageRequester("Share("+Str(i)+")", output) 
      EndIf
      *Buffer+4
    Next
    NetApiBufferFree_(*Buffer)
  Else
    Debug "SystemError:" +Str(result)
  EndIf
  ;FreeMemory(ServerUniCode)
EndProcedure
Danke BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Antworten