[vb.net] Attempted to read or write protected memory.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
Beste Tweakers,

Ik ben al 2 dagen bezig om een klein software tool te schrijven om een controller aan te sturen.
Ik komt er echt niet meer uit en daarom vraag ik jullie hulp.

Het probleem:
Bij mijn tafel zat een driver hierbij zat ook een class bij, in deze class staat de volgende regel:
code:
1
Declare Function GlobalArrayGet Lib "XPS_C8_drivers.dll" (ByVal SocketIndex As Integer, ByVal Number As Integer, ByVal ValueString As String) As Integer


Vervolgens wil ik met mijn programma deze functie uitvoeren:
code:
1
2
3
Dim fout As Integer
Dim errorString As String
fout = XPS_C8.GlobalArrayGet(form1.SocketID, 1, errorString)


(socket ID staat in een andere form en komt WEL goed door)

Wanneer ik dit uitvoer krijg ik dus de error:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Ik heb al verschillende dingen geprobeerd maar niks helpt; ook dit niet:
- ByVal ValueString As String VERVANGEN NAAR ByRef ValueString As String

Wanneer ik dit doet werkt het wel maar half:
code:
1
2
3
Dim fout As Integer
Dim errorString As String = "132465789"
fout = XPS_C8.GlobalArrayGet(form1.SocketID, 1, errorString)


Nu wordt de string niet groter dan 9 tekens :S

Dit zal vast een beginnersvraag zijn, maar ik zal u dankbaar zijn :)

^ Post is hierboven!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarschijnlijk word er door de DLL in de errorString geschreven? Dan zul je moeten zorgen dat er een stuk geheugen meegegeven word die groot genoeg is om het resultaat in te schrijven.

Het is dan handiger om de functie te declareren met in de signature een StringBuilder, en dan een StringBuilder mee te geven die is geïnitialiseerd met als grootte een waarde die groter of gelijk is aan de maximale waarde van de resulterende string.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
Woy schreef op vrijdag 06 januari 2012 @ 11:36:
Waarschijnlijk word er door de DLL in de errorString geschreven? Dan zul je moeten zorgen dat er een stuk geheugen meegegeven word die groot genoeg is om het resultaat in te schrijven.

Het is dan handiger om de functie te declareren met in de signature een StringBuilder, en dan een StringBuilder mee te geven die is geïnitialiseerd met als grootte een waarde die groter of gelijk is aan de maximale waarde van de resulterende string.
Een hoop termen de string die eruit komt is max. 500 tekens; ik zal dus even kijken hoe een string builder werkt :)

ps. Zou je een voorbeeld kunnen geven?

[ Voor 4% gewijzigd door Strunkie op 06-01-2012 11:39 ]

^ Post is hierboven!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Strunkie schreef op vrijdag 06 januari 2012 @ 11:37:
[...]


Een hoop termen de string die eruit komt is max. 500 tekens; ik zal dus even kijken hoe een string builder werkt :)

ps. Zou je een voorbeeld kunnen geven?
Dit is even uit mijn hoofd, en ik ben niet erg bekend met VB.NET dus er is best kans dat het niet goed werkt ;)

Visual Basic .NET:
1
Declare Function GlobalArrayGet Lib "XPS_C8_drivers.dll" (ByVal SocketIndex As Integer, ByVal Number As Integer, ByVal ValueString As StringBuilder) As Integer

Visual Basic .NET:
1
2
3
Dim fout As Integer
Dim errorString As StringBuilder = New StringBuilder(500)
fout = XPS_C8.GlobalArrayGet(form1.SocketID, 1, errorString)


na de aanroep kun je dan gewoon errorString.ToString() gebruiken om de daadwerkelijke string te verkrijgen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
Woy schreef op vrijdag 06 januari 2012 @ 15:32:
[...]

Dit is even uit mijn hoofd, en ik ben niet erg bekend met VB.NET dus er is best kans dat het niet goed werkt ;)

Visual Basic .NET:
1
Declare Function GlobalArrayGet Lib "XPS_C8_drivers.dll" (ByVal SocketIndex As Integer, ByVal Number As Integer, ByVal ValueString As StringBuilder) As Integer

Visual Basic .NET:
1
2
3
Dim fout As Integer
Dim errorString As StringBuilder = New StringBuilder(500)
fout = XPS_C8.GlobalArrayGet(form1.SocketID, 1, errorString)


na de aanroep kun je dan gewoon errorString.ToString() gebruiken om de daadwerkelijke string te verkrijgen.
Dank, ik ga volgende week vrijdag testen; eerst even vakantie houden :)

^ Post is hierboven!