Автор Тема: Как правильно указать все параметры WinAPI-функции при вызове её DllCall'ом?  (Прочитано 4949 раз)

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

Оффлайн burn [?]

  • Новичок
  • *
  • Сообщений: 4
  • Репутация: 0
  • Пол: Мужской
    • Награды
Имеется прототип функции WinAPI, взятый из MSDN, например, такой:
int ScrollWindowEx(HWND hWnd, int dx, int dy, RECT *prcScroll, RECT *prcClip, HRGN hrgnUpdate, LPRECT prcUpdate, UINT flags)При этом некоторые параметры при вызове могут быть NULL, в частности *prcScroll, *prcClipm, hrgnUpdate и prcUpdate. Как правильно вызвать эту функцию DllCall'ом, учитывая, что в AutoIt значения NULL нет. Если просто не указывать ненужные параметры, например так:
Код: AutoIt [Выделить]
DllCall("user32.dll", "int", "ScrollWindowEx", "HWND", $hwnd, "int", $dx, "int", $dy)

то AutoIt падает при попытке исполнить скрипт.
Вопрос: какие значения указать как NULL - пустую строку ""? ноль? что?
Брось утку, когда берёшь ты в руки саксофон!..

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


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
burn  [?]
Цитировать
какие значения указать как NULL - пустую строку ""? ноль? что?
Обычно для чисел - ноль, для строк - пустую строку. Я обычно ставлю ноль, а если есть проблемы - пустую строку. Например, для HWND ноль точно работает вместо NULL.


Добавлено: Июнь 28, 2012, 13:09:06
http://autoit-script.ru/index.php?topic=3779.0.html
« Последнее редактирование: Июнь 28, 2012, 13:09:06 от InnI, Причина: Объединение сообщений »

Онлайн sngr [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 927
  • Репутация: 372
    • Награды
  • Версия AutoIt: 3.3.8.1

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


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Здесь NULL имеется ввиду отсутствие адреса - 0.

Код: AutoIt [Выделить]
$Ret = DllCall('user32.dll', 'int', 'ScrollWindowEx', 'hwnd', $hWnd, 'int', $iDx, 'int', $iDy, 'ptr', 0, 'ptr', 0, 'handle', 0, 'ptr', 0, 'uint', $iFlags)
If (@Error) Or (Not $Ret[0]) Then
    ; Error!
EndIf


В полной версии это будет выглядеть так:

Код: AutoIt [Выделить]
$tScroll = DllStructCreate($tagRECT)
DllStructSetData($tScroll, 'Left', ...)
DllStructSetData($tScroll, 'Top', ...)
DllStructSetData($tScroll, 'Right', ...)
DllStructSetData($tScroll, 'Bottom', ...)
$pScroll = DllStructGetPtr($tScroll)

$tClip = DllStructCreate($tagRECT)
DllStructSetData($tClip, 'Left', ...)
DllStructSetData($tClip, 'Top', ...)
DllStructSetData($tClip, 'Right', ...)
DllStructSetData($tClip, 'Bottom', ...)
$pClip = DllStructGetPtr($tClip)

$tUpdate = DllStructCreate($tagRECT)
DllStructSetData($tUpdate, 'Left', ...)
DllStructSetData($tUpdate, 'Top', ...)
DllStructSetData($tUpdate, 'Right', ...)
DllStructSetData($tUpdate, 'Bottom', ...)
$pUpdate = DllStructGetPtr($tUpdate)

$Ret = DllCall('user32.dll', 'int', 'ScrollWindowEx', 'hwnd', $hWnd, 'int', $iDx, 'int', $iDy, 'ptr', $pScroll, 'ptr', $pClip, 'handle', $hRgn, 'ptr', $pUpdate, 'uint', $iFlags)
If (@Error) Or (Not $Ret[0]) Then
    ; Error!
EndIf



Добавлено: Июнь 28, 2012, 14:40:23
Для DllCall() нет прототипов, поэтому опускать параметры нельзя.


Думай, прежде чем говорить.

Оффлайн burn [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Yashied, именно твоего ответа я и ждал.
Цитировать
Здесь NULL имеется ввиду отсутствие адреса - 0.
Не согласен, что 0 - это отсутствие адреса (в глобальном смысле), но раз DllCall так это воспринимает, не суть.
Цитировать
Для DllCall() нет прототипов, поэтому опускать параметры нельзя.
Поясни, что значить "для DllCall нет прототипов"?

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


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
burn  [?]
Цитировать
именно твоего ответа я и ждал.
Ну и задавали бы вопрос конкретному человеку, чтоб другие не мешали вашему диалогу.

Оффлайн burn [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
InnI
Я ни сколь не умоляю твоих знаний, просто хотел убедиться, что не только ты так считаешь. А то в конференции спросил, мне так столько интересных вариантов предложили... Раз больше двух человек сходятся во мнении, значит вероятность, что они правы - 99%

Закрывайте тему, вопрос решён.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
burn  [?]
Цитировать
Закрывайте тему, вопрос решён.
На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
Тема не решена

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


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
InnI  [?]
Цитировать
Ну и задавали бы вопрос конкретному человеку, чтоб другие не мешали вашему диалогу.
у нас так не делается, имей в виду ;)
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


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


 

Похожие темы

  Тема / Автор Ответов Последний ответ
13 Ответов
7885 Просмотров
Последний ответ Декабрь 09, 2009, 23:56:19
от Kaster
4 Ответов
2364 Просмотров
Последний ответ Декабрь 06, 2012, 16:54:45
от IoffeMax
6 Ответов
3717 Просмотров
Последний ответ Март 20, 2013, 17:19:53
от ivsatel
3 Ответов
1387 Просмотров
Последний ответ Август 27, 2015, 17:30:54
от qqww22
25 Ответов
3807 Просмотров
Последний ответ Сентябрь 09, 2015, 00:13:10
от InnI
3 Ответов
1400 Просмотров
Последний ответ Февраль 20, 2016, 09:00:13
от mmsgeorge
3 Ответов
1830 Просмотров
Последний ответ Июнь 16, 2016, 20:05:55
от Dimmak
4 Ответов
1004 Просмотров
Последний ответ Май 30, 2017, 13:57:49
от ErikRosso
0 Ответов
381 Просмотров
Последний ответ Февраль 24, 2018, 10:30:55
от TpeTTep
2 Ответов
174 Просмотров
Последний ответ Апрель 17, 2019, 14:20:20
от Cornet