Size: a a a

2021 June 04

Ra

Ruslan aka DUDE in AutoIT RU
поинтер можно задать в уже существующую структуру
а создавать ее или брать существующую - решать уже тебе
источник

ox

osm x in AutoIT RU
выделил алоком например.
Вообще мне это надо для расширения функционала моего транслятора, т.к. для общения с драйвером диска там дальше много сложных структур и нужно иметь возможность делать вложенные структуры.
Обертка эта примитивная не поддерживает вложенные структуры, потому надо это програмно делать. идиально если был бы какой нить viewMem c функциями вида readUint8LE, readUint16LE и т.д. но такого тоже нету как я понял
источник

Ra

Ruslan aka DUDE in AutoIT RU
весь код в студию
источник

Ra

Ruslan aka DUDE in AutoIT RU
на аутоите разумеется
источник

ox

osm x in AutoIT RU
Func MemView($size, $ptr = 0)
 Local $ret[]
 $ret.struct = _DllStructCreate("align 1; byte bytes[" & $size & "];", $ptr)
 $ret.ptr = DllStructGetPtr($ret.struct)
 $ret.size = $size
 return $ret
EndFunc
Func MemAlloc($size)
 return MemView($size)
EndFunc
ну я так выделяю, а не системным алоком, что бы когда ссылки на переменные закончатся автоматом удалило(хотя я не уверен, хз как устроено в аите это, но надеюсь что так)
источник

ox

osm x in AutoIT RU
а вообще посмотри, я кидал же архив. там все функции есть, и скопмилированные структуры , и транслятор
источник

Ra

Ruslan aka DUDE in AutoIT RU
покажи куда ты присваивать собрался?
источник

ox

osm x in AutoIT RU
ну посмотри сорсы
источник

ox

osm x in AutoIT RU
Func SmartReadAttributes($hDevice, $bDriveNumber = 0)
 Local $cip = SENDCMDINPARAMS()

   $cip.cBufferSize = $READ_ATTRIBUTE_BUFFER_SIZE
   $cip.bDriveNumber = $bDriveNumber
   $cip.irDriveRegs_bFeaturesReg = $READ_ATTRIBUTES
   $cip.irDriveRegs_bSectorCountReg = 1
   $cip.irDriveRegs_bSectorNumberReg = 1
   $cip.irDriveRegs_bCylLowReg = $SMART_CYL_LOW
   $cip.irDriveRegs_bCylHighReg = $SMART_CYL_HI
   $cip.irDriveRegs_bDriveHeadReg = $DRIVE_HEAD_REG
   $cip.irDriveRegs_bCommandReg = $SMART_CMD
 
 Local $mem = MemAlloc( ST_ATAOUTPARAM()._size + $READ_ATTRIBUTE_BUFFER_SIZE - 1 )
 
 Local $ret = GetBaseObj()
 
 Local $smartInfoRawList[]
 Local $smartInfoThresholdsRawList[]
 
 Local $smartInfoList[]
 Local $smartInfoMap[]

 if ( not( WinAPI_DeviceIoControl($hDevice, $SMART_RCV_DRIVE_DATA, ObjToStruct($cip), $mem.struct) ) ) then
   return $ret
 endif
 
 $ret._isResult = true
 
 Local $ptr = $mem.ptr + 16 + 2
 Local $sii = 0
 Local $i
 for $i = 0 to 30 - 1
   Local $smartRecordRaw = ObjRead(SMART_RECORD(), $ptr, true)
   $ptr += SMART_RECORD()._size
     
   if ( $smartRecordRaw.attribIndex <> 0 ) then
     $smartInfoRawList[$sii] = $smartRecordRaw
     
     Local $sir = SMART_INFO_RECORD()
     $sir.attribIndex = $smartRecordRaw.attribIndex
     $sir.attribValue = $smartRecordRaw.attribValue
     $sir.attribWorst = $smartRecordRaw.attribWorst
     $sir.attribRaw = $smartRecordRaw.attribRaw
     $sir.threshold = 0xFFFF
     $smartInfoMap[ $smartRecordRaw.attribIndex ] = $sir

     $sii = $sii + 1
   endif
 next
   
 $cip.irDriveRegs_bFeaturesReg = $READ_THRESHOLDS
 $cip.cBufferSize = $READ_THRESHOLD_BUFFER_SIZE
 if ( WinAPI_DeviceIoControl($hDevice, $SMART_RCV_DRIVE_DATA, ObjToStruct($cip), $mem.struct) ) then
   Local $ptr = $mem.ptr + 16 + 2
   Local $sii = 0
   Local $i
   for $i = 0 to 30 - 1
     Local $smartRecordRaw = ObjRead(SMART_RECORD(), $ptr, true)
     $ptr += SMART_RECORD()._size
     
     if ( $smartRecordRaw.attribIndex <> 0 ) then
       $smartInfoThresholdsRawList[$sii] = $smartRecordRaw
       
       if ( $smartInfoMap[ $smartRecordRaw.attribIndex ] <> null ) then
         $smartInfoMap[ $smartRecordRaw.attribIndex ].threshold = $smartRecordRaw.attribRaw
       endif
       
       $sii = $sii + 1
     endif
   next    
 endif
 
 Local $i = 0
 Local $j = 0
 for $i = 0 to 256 - 1
   if ( $smartInfoMap[$i] <> null ) then
     $smartInfoList[$j] = $smartInfoMap[$i]
     $j += 1
   endif
 next
 
 $ret._isResult = true
 $ret.smartInfoList = $smartInfoList
 $ret.smartInfoMap = $smartInfoMap
 $ret.smartInfoRawList = $smartInfoRawList
 $ret.smartInfoThresholdsRawList = $smartInfoThresholdsRawList
 return $ret
 
EndFunc
источник

Ra

Ruslan aka DUDE in AutoIT RU
номер строки
источник

ox

osm x in AutoIT RU
с мемАлок ? в начале, 10 примерно
источник

Ra

Ruslan aka DUDE in AutoIT RU
не вижу присвоений
одни расширения и всё
источник

Ra

Ruslan aka DUDE in AutoIT RU
в каком месте ты хотел присвоить поинтер без создания чегото там
источник

ox

osm x in AutoIT RU
да тут например Local $smartRecordRaw = ObjRead(SMART_RECORD(), $ptr, true)
источник

Ra

Ruslan aka DUDE in AutoIT RU
тут Read
а не Set
источник

ox

osm x in AutoIT RU
а какая разница
источник

Ra

Ruslan aka DUDE in AutoIT RU
0_0
источник

Ra

Ruslan aka DUDE in AutoIT RU
ничего себе
источник

Ra

Ruslan aka DUDE in AutoIT RU
источник

ox

osm x in AutoIT RU
посмотри сорс ObjRead, там вызов функции которая и юзает DllStructCreate
источник