- Offizieller Beitrag
Ich weiß nicht mehr weiter!
Entweder bin ich zu blöd, das zu verstehen oder es handelt sich um einen Bug. Vielleicht könnt ihr mich aufklären.
Wenn ich bei DllStructCreate ein "align 16" verwende, dann sollte die Struktur doch an einer Speicheradresse liegen, die durch 16 teilbar ist, oder nicht?
Manchmal klappt das, manchmal aber auch nicht. Ein kleines Testscript:
AutoIt
$sText = 'Test bla bla bla bla bla bla'
$tStruct1 = _String2Struct($sText)
$pStruct1 = DllStructGetPtr($tStruct1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $pStruct1 = ' & $pStruct1 & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Structsize = ' & DllStructGetSize($tStruct1) & @CRLF) ;### Debug Console
$eax = BitShift($pStruct1, 4) ; / 16
$eax = BitShift($eax, -4) ; * 16
$eax -= $pStruct1 ; - pointer
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $eax = ' & $eax & @CRLF) ;### Debug Console
Func _String2Struct($sString)
$sString &= Chr(0)
Local $tStruct = DllStructCreate('align 16;char[' & StringLen($sString) & '];')
DllStructSetData($tStruct, 1, $sString)
Return $tStruct
EndFunc
Alles anzeigen
Dabei kommt manchmal sowas raus:
$eax müsste aber "0" sein, wenn es eine 16-Byte-Aligned-Adresse ist.
Manchmal stimmt es aber auch: