Absturz mit RtlMoveMenory

17/02/2008 - 21:04 von Peter Hilscher | Report spam
Hallo, kann mir jemand helfen ?

folgender Code funktioniert in der IDE problemlos,
Die kompilierte EXE stürzt aber ab.

Private Type Type_InitStruct
JPG_Quality As Long
JPG_ScaleProzent As Long
JPG_DelayTime As Long
Reserve As String * 24
End Type


sub test
Dim b() As Byte, vtData As Variant, IniStr As String, ini As
Type_InitStruct
IniStr = "INITIALIZE"
With ini
.JPG_DelayTime = ComboDelayTime
.JPG_Quality = Slider_Qualitaet.Value
.JPG_ScaleProzent = Slider_Groesse.Value
.Reserve = "Hallllllo"
End With

ReDim b(LenB(ini) + LenB(IniStr)) As Byte

Call RtlMoveMemory(b(0), ByVal IniStr, LenB(IniStr))
pB = VarPtr(b(20))

' hier erfolgt dann der Absturz
Call RtlMoveMemory(ByVal pB, ByVal ini, LenB(ini))

end sub

Gruß Peter
 

Lesen sie die antworten

#1 Thorsten Albers
17/02/2008 - 22:24 | Warnen spam
Peter Hilscher schrieb im Beitrag
...
Call RtlMoveMemory(b(0), ByVal IniStr, LenB(IniStr))
pB = VarPtr(b(20))

' hier erfolgt dann der Absturz
Call RtlMoveMemory(ByVal pB, ByVal ini, LenB(ini))



Der Absturzgrund ist vermutlich bereits der vorhergehende
RtlMoveMemory()-Aufruf:
Durch 'ByVal IniStr' wird der VB-Unicode-String intern von VB in einen
ANSI-String umgewandelt, bevor er in das Byte-Array kopiert wird. Nach der
Umwandlung hat der ANSI-String Len(IniStr) Bytes = Zeichen. Vor der
Umwandlung hat er Len(IniStr) Zeichen, aber Len(IniStr) * 2 = LenB(IniStr)
Bytes, da ein Zeichen in einem VB-String 2 Bytes benötigt. Nehmen wir an ,
'IniStr' umfaßt 20 Zeichen: Dann wird versucht, aus der internen ANSI-Kopie
mit 20 Zeichen = 20 Bytes LenB(IniStr) = 80 Bytes in das Byte-Array zu
kopieren. Kann gut sein, daß dabei lesend auf nicht allozierten Speicher
zugegriffen wird, was eine Ausnahme auslöst.
Korrek sollte es also heißen:
Call RtlMoveMemory(b(0), ByVal IniStr, Len(IniStr))

Denkbar als Fehlergrund ist aber auch 'VarPtr(b(20))': Was, wenn 'IniStr'
nur 2 Zeichen umfaßt? Dann paßt 'ini' nicht mehr hinter den String ab Index
20, denn das Array wurde mit 'LenB(ini) + LenB(IniStr)' dimensioniert.
Korrek sollte es also heißen:
pB = VarPtr(b(Len(IniStr)))

-
THORSTEN ALBERS Universitàt Freiburg
albers@
uni-freiburg.de
-

Ähnliche fragen