Автор Тема: Передать структуру rect в функцию длл  (Прочитано 1490 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн badhabit [?]

  • Новичок
  • *
  • Сообщений: 36
  • Репутация: 0
    • Награды
Добрый день. У меня есть длл со следующей функцией:
enum MouseButton { MouseLeft, MouseMiddle, MouseRight };

MOUSEDLL_API int MouseClick(const HWND hwnd, const RECT rect, const MouseButton button, const int clicks,
const HWND restore_focus, const POINT restore_cursor)
Пытаюсь вызвать данную функцию из скрипта^
Код: AutoIt [Выделить]
Opt("WinTitleMatchMode", -2)

#include <WinAPI.au3>

Func MyMouseClick($hwnd, $left, $top, $right, $bottom)
    Local $rc = DllStructCreate($tagRECT)
    DllStructSetData($rc, 1, $left)
    DllStructSetData($rc, 2, $top)
    DllStructSetData($rc, 3, $right)
    DllStructSetData($rc, 4, $bottom)
    Local $pc = DllStructCreate($tagPOINT)
    DllStructSetData($pc, 1, -1)
    DllStructSetData($pc, 2, -1)
    DllCall("mouse.dll", "int", "MouseClick", "hwnd", $hwnd, "ptr",  DllStructGetPtr($rc), "int", 0, "int", 1, "hwnd", 0,  "ptr",  DllStructGetPtr($pc))

    ConsoleWrite("DllCall() result: " & @error & @CRLF)
EndFunc


$wnd = WinGetHandle("help")
MyMouseClick($wnd, 100, 100, 150, 150)
 

Скрипт крашится, видимо где-то напутал с параметрами DllCall(). Подскажите, что может быть не так...

Русское сообщество AutoIt

Передать структуру rect в функцию длл
« Отправлен: Сентябрь 07, 2016, 18:20:40 »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Передать структуру rect в функцию длл
« Ответ #1, Отправлен: Сентябрь 07, 2016, 18:52:39 »
Может быть
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int", "MouseClick", "hwnd", $hwnd, "struct",  $rc, "int", 0, "int", 1, "hwnd", $hwnd,  "struct",  $pc)


Оффлайн badhabit [?]

  • Новичок
  • *
  • Сообщений: 36

  • Автор темы
  • Репутация: 0
    • Награды
Re: Передать структуру rect в функцию длл
« Ответ #2, Отправлен: Сентябрь 08, 2016, 09:29:01 »
Может быть
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int", "MouseClick", "hwnd", $hwnd, "struct",  $rc, "int", 0, "int", 1, "hwnd", $hwnd,  "struct",  $pc)

Попробовал:
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int", "MouseClick", "hwnd", $hwnd, "struct",  $rc, "int", 0, "int", 1, "hwnd", 0,  "struct",  $pc)

все равно "крашится"... В чем может быть дело? Из программы на С функция прекрасно вызывается...
ЗЫ. второй hwnd должен быть = NULL

Русское сообщество AutoIt

Re: Передать структуру rect в функцию длл
« Ответ #2 Отправлен: Сентябрь 08, 2016, 09:29:01 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Передать структуру rect в функцию длл
« Ответ #3, Отправлен: Сентябрь 08, 2016, 09:55:09 »
А так?
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int:cdecl"...


Скорблю и помню.




Оффлайн badhabit [?]

  • Новичок
  • *
  • Сообщений: 36

  • Автор темы
  • Репутация: 0
    • Награды
Re: Передать структуру rect в функцию длл
« Ответ #4, Отправлен: Сентябрь 08, 2016, 10:37:41 »
А так?
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int:cdecl"...

О, так работает! Спасибо!

Русское сообщество AutoIt

Re: Передать структуру rect в функцию длл
« Ответ #4 Отправлен: Сентябрь 08, 2016, 10:37:41 »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Передать структуру rect в функцию длл
« Ответ #5, Отправлен: Сентябрь 08, 2016, 11:37:02 »
badhabit
а проверь, структура передается? как я написал, только поправь возврат на int:cdecl


Добавлено: Сентябрь 08, 2016, 11:37:45
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int:cdecl", "MouseClick", "hwnd", $hwnd, "struct",  $rc, "int", 0, "int", 1, "hwnd", 0,  "struct",  $pc)


Оффлайн badhabit [?]

  • Новичок
  • *
  • Сообщений: 36

  • Автор темы
  • Репутация: 0
    • Награды
Re: Передать структуру rect в функцию длл
« Ответ #6, Отправлен: Сентябрь 09, 2016, 07:23:57 »
badhabit
а проверь, структура передается? как я написал, только поправь возврат на int:cdecl


Добавлено: Сентябрь 08, 2016, 11:37:45
Код: AutoIt [Выделить]
DllCall("mouse.dll", "int:cdecl", "MouseClick", "hwnd", $hwnd, "struct",  $rc, "int", 0, "int", 1, "hwnd", 0,  "struct",  $pc)

да, проверил - именно так передаётся все корректно.
указатель на структуру, как в моем первом варианте, передавать не надо было...

Русское сообщество AutoIt

Re: Передать структуру rect в функцию длл
« Ответ #6 Отправлен: Сентябрь 09, 2016, 07:23:57 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
3875 Просмотров
Последний ответ Июль 21, 2011, 23:52:24
от Garrett
4 Ответов
4613 Просмотров
Последний ответ Сентябрь 16, 2011, 15:36:26
от DelphiExpert
0 Ответов
2655 Просмотров
Последний ответ Сентябрь 16, 2011, 15:08:08
от Garrett
4 Ответов
3251 Просмотров
Последний ответ Декабрь 01, 2011, 08:24:48
от madmasles
0 Ответов
1912 Просмотров
Последний ответ Ноябрь 30, 2011, 14:31:30
от madmasles
6 Ответов
1646 Просмотров
Последний ответ Ноябрь 05, 2014, 23:10:19
от Jotun
1 Ответов
1046 Просмотров
Последний ответ Январь 10, 2015, 01:08:31
от Garrett
2 Ответов
1105 Просмотров
Последний ответ Июнь 28, 2015, 06:40:45
от Zalman1980
3 Ответов
1022 Просмотров
Последний ответ Сентябрь 15, 2015, 19:57:32
от Prog
3 Ответов
1604 Просмотров
Последний ответ Апрель 08, 2017, 20:48:53
от Garrett