- Сообщения
- 3,999
- Репутация
- 967
Есть структура на C++
Так она заполняется
Далее эта структура передаётся по ссылке в функцию в качестве второго параметра (первый параметр, устройство)
Сама функция
Нужно её перевести на AutoIt
Вот как я себе это представляю:
Вопрос собственно такой. Каким образом теперь считать данные из области, выделенной памяти?
возвращает нам (как я понимаю) указатель на первый адрес выделенной памяти, в которой лежит наш кадр.
Почитал Интернет, просмотрел темы на форуме по работе с _MemGlobalAlloc() (спасибо Yashied`у), вроде все предельно ясно.
Но чего-то я делаю неправильно, так как у меня не получается получить картинку.
В примере на C++ данные из буфера можно считать как из массива.
Но дело в том, что в моём примере буфер, таким образом, не прочитать, ведь у нас на выходе указатель на выделенную память, а не массив.
Буду рад любой помощи.
Код:
struct CapParams
{
/* Target buffer.
* Must be at least Width * Height * sizeof(int) of size!
*/
int * Buffer;
/* Buffer width */
int Width;
/* Buffer height */
int Height;
};
Так она заполняется
Код:
struct CapParams capture;
capture.Width = 320;
capture.Height = 240;
capture.Buffer = new int[320 * 240];
Далее эта структура передаётся по ссылке в функцию в качестве второго параметра (первый параметр, устройство)
Код:
Capture(0, &capture)
Сама функция
Код:
typedef int (*CaptureProc)(unsigned int deviceno, struct CapParams *aParams);
extern CaptureProc Capture;
Нужно её перевести на AutoIt
Вот как я себе это представляю:
Код:
#Include <Memory.au3>
;~ Создаю структуру
$tSCP = DllStructCreate("ptr Buffer;int Width;int Height;")
If @error Then
MsgBox(0,"","Error in DllStructCreate " & @error);
Exit
EndIf
;~ Заполняю структуру
DllStructSetData($tSCP, "Width", 320)
DllStructSetData($tSCP, "Height", 240)
$hBuf = _MemGlobalAlloc(DllStructGetData($tSCP, "Width") * DllStructGetData($tSCP, "Height"), 2)
DllStructSetData($tSCP, "Buffer", _MemGlobalLock($hBuf))
;~ Далее. Функция помещает кадр в "Buffer". Возвращает True
$a_Call = DllCall($h_Dll, "int", "Capture", "int", $nDevice, "int*", DllStructGetPtr($tSCP, "Buffer"))
_MemGlobalUnlock($hBuf)
;~ Смотрим. Всё ок. ( Вроде :) )
ConsoleWrite(DllStructGetData($tSCP, "Width") & @CRLF)
ConsoleWrite(DllStructGetData($tSCP, "Height") & @CRLF)
ConsoleWrite(DllStructGetData($tSCP, "Buffer") & @CRLF)
Вопрос собственно такой. Каким образом теперь считать данные из области, выделенной памяти?
Код:
DllStructGetData($tSCP, "Buffer")
Почитал Интернет, просмотрел темы на форуме по работе с _MemGlobalAlloc() (спасибо Yashied`у), вроде все предельно ясно.
Но чего-то я делаю неправильно, так как у меня не получается получить картинку.
В примере на C++ данные из буфера можно считать как из массива.
Код:
printf("%c", capture.Buffer[i])
Буду рад любой помощи.