Форум программистов, компьютерный форум CyberForum.ru

C++ <- AutoIt - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Ilyialat
7 / 7 / 1
Регистрация: 12.09.2012
Сообщений: 44
12.09.2012, 22:14     C++ <- AutoIt #1
Столкнулся с проблемой в AuoIt... Интерпретатор очень медленно обрабатывает циклы... А у меня сканирование изображений... 786 000 для 1024 * 768 =) Вот и появилась мысль написать dll... Потому, что существующие мне не подходят( Синтаксис С++ мне известен немного, но на этом знания и заканчиваются, так как языком не пользуюсь)
Попытался перевести код... Но выскакивает ошибка памяти при попытке объявления массива [1024 * 768]... [102 * 768] прокатывает ещё... И ещё где-то в коде у меня ошибка... Помогите, пожалуйста)
Код автоит:
Local $hDC = _WinAPI_GetDC($hWnd)
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
Local $hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
Global $tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
; удаление данных для избежаня утечки памяти
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hMemDC)
_WinAPI_DeleteObject($hSv)
_WinAPI_DeleteObject($hDC)

Код С++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    HDC dc;
    HWND hwnd;
    hwnd = FindWindow(NULL, "3");
    dc = GetDC(hwnd);
    HDC memdc;
    memdc = CreateCompatibleDC(dc);
    HBITMAP bitmap;
    bitmap = CreateCompatibleBitmap(dc, 1024, 768);
    void *sv;
    sv = SelectObject(memdc, bitmap);
    BitBlt(memdc, 0, 0, 1024, 768, dc, 0, 0, SRCCOPY);
    SelectObject(memdc, sv);
    DeleteDC(memdc);
    ReleaseDC(hwnd, dc);
    DWORD tbits[102 * 768];
    GetBitmapBits(bitmap, 4 * 1024 * 768, tbits);
    int x = 5;
    int y = 2;
    int pixelcolor = tbits[y * 1024 + x];
    std::cout << pixelcolor;
    DeleteObject(bitmap);
    DeleteObject(memdc);
    DeleteObject(sv);
    DeleteObject(dc);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2012, 22:14     C++ <- AutoIt
Посмотрите здесь:

Скрипт на AutoIT
AutoIt AutoIt и Эксель
AutoIt AutoIT
Нужен простой скрипт AutoIt AutoIt
Autoit в C# C#
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
13.09.2012, 17:17     C++ <- AutoIt #2
DWORD tbits[102 * 768]; -> DWORD tbits[1024 * 768];
Ilyialat
7 / 7 / 1
Регистрация: 12.09.2012
Сообщений: 44
13.09.2012, 18:03  [ТС]     C++ <- AutoIt #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
HDC dc;
    HWND hwnd;
    hwnd = FindWindow(NULL, "3");
    dc = GetDC(hwnd);
    HDC memdc;
    memdc = CreateCompatibleDC(dc);
    HBITMAP bitmap;
    bitmap = CreateCompatibleBitmap(dc, 1024, 768);
    void *sv;
    sv = SelectObject(memdc, bitmap);
    BitBlt(memdc, 0, 0, 1024, 768, dc, 0, 0, SRCCOPY);
    SelectObject(memdc, sv);
    DeleteDC(memdc);
    ReleaseDC(hwnd, dc);
    DWORD tbits[1024 * 768];
    GetBitmapBits(bitmap, 4 * 1024 * 768, tbits);
    DWORD pixelcolor;
    for(int x = 0; x < 1024; x++)
    {
    for(int y = 0; y < 768; y++)
    {
    pixelcolor = tbits[y * 1024 + x];
    std::cout << pixelcolor;
    std::cout << " ";
    std::cout << x;
    std::cout << " ";
    std::cout << y;
    std::cout << "\n\r";
    }}
    DeleteObject(bitmap);
    DeleteObject(memdc);
    DeleteObject(sv);
    DeleteObject(dc);
Не работает
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
13.09.2012, 20:26     C++ <- AutoIt #4
Видимо, великоват массив для стека. Если статический массив устроит, то попробуй
C++
1
static DWORD tbits[1024 * 768];
иначе
C++
1
2
std::vector<DWORD> tbits(1024 * 768);
GetBitmapBits(bitmap, 4 * 1024 * 768, tbits.data());
Ilyialat
7 / 7 / 1
Регистрация: 12.09.2012
Сообщений: 44
13.09.2012, 21:30  [ТС]     C++ <- AutoIt #5
Cпасибо!!!

Добавлено через 2 минуты
Ещё осталось разобраться со следующим кодом:
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($bmp)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$iBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($iBitmap)
Dim $iMatrix[$iHeight][$iWidth]
For $H = 0 To $iHeight - 1
For $W = 0 To $iWidth - 1
$iMatrix[$H][$W] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $W, $H), 6)
Next
Next
_GDIPlus_ImageDispose($hImage)
_WinAPI_DeleteObject($iBitmap)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()
Но с этим, думаю, я справлюсь)
Yandex
Объявления
13.09.2012, 21:30     C++ <- AutoIt
Ответ Создать тему
Опции темы

Текущее время: 16:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru