Что нового

Как правильно указать все параметры WinAPI-функции при вызове её DllCall'ом?

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
нет. Если просто не указывать ненужные параметры, например так:
Код:
DllCall("user32.dll", "int", "ScrollWindowEx", "HWND", $hwnd, "int", $dx, "int", $dy)
то AutoIt падает при попытке исполнить скрипт.
Вопрос: какие значения указать как
Код:
NULL
- пустую строку ""? ноль? что?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Re: Как правильно указать все параметры WinAPI-функции при вызове её DllCall\'ом?

burn [?]
какие значения указать как NULL - пустую строку ""? ноль? что?
Обычно для чисел - ноль, для строк - пустую строку. Я обычно ставлю ноль, а если есть проблемы - пустую строку. Например, для HWND ноль точно работает вместо NULL.


Добавлено:
Сообщение автоматически объединено:

http://autoit-script.ru/index.php/topic,3779.0.html
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Как правильно указать все параметры WinAPI-функции при вызове её DllCall\'ом?

Здесь NULL имеется ввиду отсутствие адреса - 0.

Код:
$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


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

Код:
$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



Добавлено:
Сообщение автоматически объединено:

Для DllCall() нет прототипов, поэтому опускать параметры нельзя.
 
Автор
B

burn

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

burn

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

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
burn [?]
Закрывайте тему, вопрос решён.
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
InnI [?]
Ну и задавали бы вопрос конкретному человеку, чтоб другие не мешали вашему диалогу.
у нас так не делается, имей в виду ;)
 
Верх