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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Ilyialat
7 / 7 / 1
Регистрация: 12.09.2012
Сообщений: 44
#1

C++ <- AutoIt - C++

12.09.2012, 22:14. Просмотров 1353. Ответов 4
Метки нет (Все метки)

Столкнулся с проблемой в 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 в C# - C#
Добрый день. Пытаюсь использовать функции autoitа в C#. Пробовал разными способами и так и этак но ничего хорошего не получается, хотя в...

AutoIT - AutoIt
Уважаемые, помогите по вышеуказанной теме. Не знаю с чего начать, что почитать или какие нибудь видеоуроки посмотреть, справка вся на...

AutoIt & C# - AutoIt
Раньше использовал в AutoIt такие строки $oIE = _IECreate (&quot;https://sbi.sberbank.ru:9443/ic/&quot;) $oForm = _IEFormGetObjByName ($oIE,...

Скрипт на AutoIT - Разработка ПО
При помощи языка AutoIT пишу скрипт,который будет устанавливать подряд ряд программ! При установке SQL Server столкнулся с проблемой. ...

.NET 4.x Взаимодействие C# и Autoit - C#
Имеется 2 программы, на C# и Autoit, нужно что бы через .ini файл значения передавались из C#-программы в Autoit. Проблема в том, что...

ЯЗЫК autoit - AutoIt
HotKeySet(&quot;{F6}&quot;,&quot;_Exit&quot;), ЯЗЫК autoit Как на примере этой строчке сделать так же, но что б на одну кнопку можно было включить, а на...

Альтернатива AutoIt - AutoIt
По неким причинам решил перейти с autoit на другой язык. Какой язык выбрать для этого? С++, java, C#? Или что то другое? Что мне...

AutoIt и Эксель - AutoIt
Выкидываю программку которая позволяет сделать выборку условию &quot;Заполнено&quot; или &quot;Незаполнено&quot; ячейка 5го столбика и поместить данные всей...

AutoIt и Adobe AIR - AutoIt
Приветствую всех. Господа старожилы, не откажите в помощи или совете, пожалуйста. Есть такая задача: Нужно установить...

Нужен простой скрипт AutoIt - AutoIt
Описание: Запускаешь скрипт. Только при удерживании Левого CTRL должны имитироваться нажатия клавиш. Именно имитироваться! А не просто...

Скрипт AutoIt, вложенные циклы - AutoIt
Не знал куда написать, погуглил - не нашел, так как сделать зацикливание внутри другого зацикливания?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru