#include <WinAPIEx.au3>
; Вот к примеру данные которые формирует функция на C++ и после того как мы её вызываем,
; отдаёт нам указатель на структуру.
#Region Function C++
; Си функция формирует структуру.
$sStr1 = 'Всем'
$sStr2 = 'спасибо'
$sStr3 = 'за помощь!'
$sStr4 = 'С уважением'
$sStr5 = 'Garrett!'
; Си функция создает строки 'char[n]'.
$tStr1 = DllStructCreate('char['& StringLen($sStr1)+1 &']')
DllStructSetData($tStr1, 1, $sStr1)
$pStr1 = DllStructGetPtr($tStr1)
$tStr2 = DllStructCreate('char['& StringLen($sStr2)+1 &']')
DllStructSetData($tStr2, 1, $sStr2)
$pStr2 = DllStructGetPtr($tStr2)
$tStr3 = DllStructCreate('char['& StringLen($sStr3)+1 &']')
DllStructSetData($tStr3, 1, $sStr3)
$pStr3 = DllStructGetPtr($tStr3)
$tStr4 = DllStructCreate('char['& StringLen($sStr4)+1 &']')
DllStructSetData($tStr4, 1, $sStr4)
$pStr4 = DllStructGetPtr($tStr4)
$tStr5 = DllStructCreate('char['& StringLen($sStr5)+1 &']')
DllStructSetData($tStr5, 1, $sStr5)
$pStr5 = DllStructGetPtr($tStr5)
; Си функция создает массив указателей 'char *'.
$tPtrArr = DllStructCreate('ptr[5]')
DllStructSetData($tPtrArr, 1, $pStr1, 1)
DllStructSetData($tPtrArr, 1, $pStr2, 2)
DllStructSetData($tPtrArr, 1, $pStr3, 3)
DllStructSetData($tPtrArr, 1, $pStr4, 4)
DllStructSetData($tPtrArr, 1, $pStr5, 5)
$pPtrArr = DllStructGetPtr($tPtrArr)
; Си функция возвращает указатель 'char **'.
; Return $pPtr
$tPtr = DllStructCreate('ptr')
DllStructSetData($tPtr, 1, $pPtrArr)
$pPtr = DllStructGetPtr($tPtr)
#EndRegion Function C++
#Region Function Autoit
; Итак, мы получили указатель Ptr (char **).
Local $aRet[1] = [$pPtr] ; DllCall(...)
; Формируем структуру в Autoit
$tRetPtr = DllStructCreate('ptr', $aRet[0])
; Получаем указатель на массив строк.
; Тут нужно как-то по "взрослому" получить размер массива указателей,
; однако, это уже отдельная тема :)
$tRetArr = DllStructCreate('ptr[5]', DllStructGetData($tRetPtr, 1))
; Получаем строки.
; Тут возник вопрос заданный в теме.
; http://autoit-script.ru/index.php?topic=18576.msg112153;topicseen
; Большое спасибо всем, кто отозвался: CreatoR, Viktor1703, Yashied, madmasles!
; Yashied, madmasles +1 ваши варианты то, что надо.
$pRetStr1 = DllStructGetData($tRetArr, 1, 1)
$tRetStr1 = DllStructCreate('char['& _WinAPI_StrLen($pRetStr1, 0) &']', $pRetStr1)
$sRetStr1 = DllStructGetData($tRetStr1, 1)
$pRetStr2 = DllStructGetData($tRetArr, 1, 2)
$tRetStr2 = DllStructCreate('char['& _WinAPI_StrLen($pRetStr2, 0) &']', $pRetStr2)
$sRetStr2 = DllStructGetData($tRetStr2, 1)
$pRetStr3 = DllStructGetData($tRetArr, 1, 3)
$tRetStr3 = DllStructCreate('char['& _WinAPI_StrLen($pRetStr3, 0) &']', $pRetStr3)
$sRetStr3 = DllStructGetData($tRetStr3, 1)
$pRetStr4 = DllStructGetData($tRetArr, 1, 4)
$tRetStr4 = DllStructCreate('char['& _WinAPI_StrLen($pRetStr4, 0) &']', $pRetStr4)
$sRetStr4 = DllStructGetData($tRetStr4, 1)
$pRetStr5 = DllStructGetData($tRetArr, 1, 5)
$tRetStr5 = DllStructCreate('char['& _WinAPI_StrLen($pRetStr5, 0) &']', $pRetStr5)
$sRetStr5 = DllStructGetData($tRetStr5, 1)
ConsoleWrite(StringFormat('=================================\r\n'))
ConsoleWrite(StringFormat('%7s %s %s\r\n\t%s %s\r\n', $sRetStr1, $sRetStr2, $sRetStr3, $sRetStr4, $sRetStr5))
ConsoleWrite(StringFormat('=================================\r\n'))
#EndRegion Function Autoit