RtlCompareMemory Unverständnis

27/10/2016 - 17:08 von Christian Zimmermann | Report spam
Hallo Leute.

Entweder stehe ich auf dem Schlauch, oder RtlCompareMemory verhàlt sich
nicht wie beschrieben. Folgendes liefert mir "zuviel" des Guten (resp.
Gewollten):

Private Declare Function RtlCompareMemory Lib "ntdll.dll" (ByRef Source1
As Any, ByRef Source2 As Any, ByRef Length As Long) As Long

Private Sub Vergleich()
Dim b1() As Byte, b2() As Byte
Dim i As Long

ReDim b1(1 To 10)
ReDim b2(1 To 10)

For i = 1 To 10
b1(i) = i
b2(i) = i
Next i
i = 5
MsgBox RtlCompareMemory(b1(1), b2(1), i)
End Sub

Es scheint so, als interessiert die Làngenangabe nicht. Ich bekomme als
Ergebnis 10 oder mehr ausgegeben. Erwartet ist 5, da hier der dritte
Parameter greifen sollte, oder nicht?

Kann man damit leben, wenn man's weiß. Wer aber auf die Idee kommt auf
Gleichheit zweier Abschnitte zu prüfen, à la

If RtlCompareMemory(b1(1), b2(1), i) = i Then ...

der hat dann leider verloren.

Ein >= ist hier angebracht.

Frustrierend ist das aber schon, da hier möglicherweise unnötig
Vergleiche produziert werden, da die Vergleicherei nicht spàtestens nach
der Anzahl Bytes des Length-Parameters aufhört. Getestet unter Vista
32bit business und Win7 home.

Microsoft beschreibt RtlCompareMemory folgendermaßen (Auszug):

"Return value

RtlCompareMemory returns the number of bytes in the two blocks that
match. If all bytes match up to the specified Length value, the Length
value is returned.
Remarks

The routine starts by comparing the first byte in the first block to the
first byte in the second block, and continues to compare successive
bytes in the two blocks while the bytes match. The routine stops
comparing bytes when it encounters the first pair of bytes that are not
equal, or when the number of matching bytes equals the Length parameter
value, whichever occurs first."

Gruß,
Christian
 

Lesen sie die antworten

#1 Ulrich Möller
27/10/2016 - 22:24 | Warnen spam
Am 27.10.2016 um 17:08 schrieb Christian Zimmermann:
Hallo Leute.

Entweder stehe ich auf dem Schlauch, oder RtlCompareMemory verhàlt sich
nicht wie beschrieben. Folgendes liefert mir "zuviel" des Guten (resp.
Gewollten):

Private Declare Function RtlCompareMemory Lib "ntdll.dll" (ByRef Source1
As Any, ByRef Source2 As Any, ByRef Length As Long) As Long

Private Sub Vergleich()
Dim b1() As Byte, b2() As Byte
Dim i As Long

ReDim b1(1 To 10)
ReDim b2(1 To 10)

For i = 1 To 10
b1(i) = i
b2(i) = i
Next i
i = 5
MsgBox RtlCompareMemory(b1(1), b2(1), i)
End Sub

Es scheint so, als interessiert die Làngenangabe nicht. Ich bekomme als
Ergebnis 10 oder mehr ausgegeben. Erwartet ist 5, da hier der dritte
Parameter greifen sollte, oder nicht?

Kann man damit leben, wenn man's weiß. Wer aber auf die Idee kommt auf
Gleichheit zweier Abschnitte zu prüfen, à la

If RtlCompareMemory(b1(1), b2(1), i) = i Then ...

der hat dann leider verloren.

Ein >= ist hier angebracht.

Frustrierend ist das aber schon, da hier möglicherweise unnötig
Vergleiche produziert werden, da die Vergleicherei nicht spàtestens nach
der Anzahl Bytes des Length-Parameters aufhört. Getestet unter Vista
32bit business und Win7 home.

Microsoft beschreibt RtlCompareMemory folgendermaßen (Auszug):

"Return value

RtlCompareMemory returns the number of bytes in the two blocks that
match. If all bytes match up to the specified Length value, the Length
value is returned.
Remarks

The routine starts by comparing the first byte in the first block to the
first byte in the second block, and continues to compare successive
bytes in the two blocks while the bytes match. The routine stops
comparing bytes when it encounters the first pair of bytes that are not
equal, or when the number of matching bytes equals the Length parameter
value, whichever occurs first."

Gruß,
Christian



Lt. MSDN sollte die Deklaration folgendermaßen aussehen:

Declare Function RtlCompareMemory Lib "ntdll.dll" ( _
ByRef Source1 As Any, _
ByRef Source2 As Any, _
*ByVal* Length As Long) As Long

Ulrich

Ähnliche fragen