Что нового

Работа с DLL: Как отправить в DLL-файл (фукцию) значение и вернуть обратно?

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Вот я и до DLL добрался. :smile: Суть такова. Собираюсь написать DLL-библиотечку на другом ЯП. После чего прикручу ее к AutoIt скрипту. Роль библиотечки такова: AutoIt-скрипт отсылает в функцию DLL значение. Значение там обрабатывается и возвращается результат обратно. Совершенно не представляю как это сделать... В этом и вопрос: как отправить значение в DLL-файл и вернуть результат? - ведь это в принципе возможно? :shok:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 610
Репутация
2 438
Код:
$sData = "Some data"

$Struct = DllStructCreate("char Data[256]")
DllStructSetData($Struct, "Data", $sData)

$aRet = DllCall("MyLibrary.dll", "int", "ParseData", "ptr", DllStructGetPtr($Struct))
ConsoleWrite($aRet[0] & @LF)


Сама Dll'ка получает указатель на структуру с данными, и, либо возвращает int, либо изменяет данные (что позже можно получить через DllStructureGetData).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Очень странный вопрос для того, кто собрался написать dll библиотеку. На каком ЯП ты собираешься писать ее? Лучше сначало изучить инфу по dll в целом и по экспорту функций в частности. AutoIt здесь вообщем-то не причем.
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Yashied

Библиотечку хочу написать на PureBasic. Там все довольно просто. Создаешь DLL-процедуру и пишешь обычный программный код, ну и компилируешь в DLL-файл. Вчера поэксперементировал. Получилось прикрутить DLL, который просто выводит окно сообщения - это просто, что в принципе прикручивается. :smile: А вот с переменными пока не разберусь. Вообще нужно обмен данными с библиотечкой наладить. Вот, например, до меня как-то не доходит, что делают последние два параметра (и типа) в "DllCall"? - те, что после указания имени вызываемой DLL функции.


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

Yashied [?]
Лучше сначало изучить инфу по dll в целом и по экспорту функций в частности.
Если дадите ссылочки на ресурсы с необходимой мне информацией (в выборе того, что мне необходимо, пологаюсь на Ваш опыт), буду благодарен.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Например сама библиотека Test.dll:
Код:
ProcedureDLL.f Formula(x.f, y.f)
  z.f = (x+y)*(x-y)
  ProcedureReturn z
EndProcedure
Вызвать в библиотеке Test.dll функцию Formula, указав тип возврата значения float, передав ей две переменные $a и $b типа float
Код:
$a= 3.333
$b = 5.555
$dll = DllOpen(@ScriptDir&"\Test.dll")
$result = DllCall($dll, "float", "Formula", "float", $a, "float", $b)
DllClose($dll)
MsgBox(64, "Itog", $result[0])
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Yuriy
Да, я уже разобрался сам, буквально только что. Ни кто так и не сказал, что параметры собсвенно и передают значения в функцию ;D. Еще была проблема в том, что PureBasic у меня х64, а AutoIt х86 - библиотека сначала не открывалась вовсе. Поставил PureBasic х86 - сейчас все отлично работает.

Спасибо за помощь, которую я получаю уже не в первый раз (жму +1, но говорит в течении 24-х часов нельзя! :smile:)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Kalisnik, по PureBasic есть неплохой форум. Там ты можешь найти ответы на большинство вопросов.

P.S

Кстати, приколная штука этот PureBasic, будет время, нужно покопаться в нем (благо там есть толковая справка).
 

asdf8

Скриптер
Сообщения
564
Репутация
152
OffTopic:

[?]
Цитата сказал(а):
по PureBasic есть неплохой форум.
Есть еще более неплохой форум

ЯП неплохой, есть свои плюсы и минусы:

плюсы: компилируемый ЯП с простым синтаксисом позволяет создавать небольшие по размеру exe и dll файлы, очень быстрый - математика и обработка текста на порядки быстрее чем в AutoIt.

минусы: платный, некоторые функции на порядок медленнее чем в AutoIt (конкатенация строк, некоторые GUI-функции), сильно недоделанные регэкспы, нет нативной поддержки COM-объектов, нельзя передать массив в функцию находящуюся в dll написанную на purebasic, не поддерживает строки с chr(0).

 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
asdf8 сказал(а):
...нельзя передать массив в функцию находящуюся в dll написанную на purebasic.
А в других ЯП можно? Только структура...
 

asdf8

Скриптер
Сообщения
564
Репутация
152
[?]
Цитата сказал(а):
А в других ЯП можно?
в срр можно, (из программы на срр :smile:, из AutoIt - затрудняюсь сразу ответить).

ps: забыл - purebasic поддерживает потоки!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
В данный момент меня PureBasic заинтересовал возможностью создавать dll относительно простым способом. Однозначно стоит разобраться в этом чуде. Но вот создание GUI и работа с ним, IMHO в AutoIt намного удобнее. А еще, как я понял, в PureBasic можно создать ActiveX. Давно хотел написать свое меню в Explorer'e.

Kalisnik

Я вот попробывал передать структуру в dll... Ты прав, это очень просто реализуется.

Код:
Structure MyPoint
  x.i
  y.i
EndStructure

ProcedureDLL.i MyFunction(*Point.MyPoint)
  *Point.MyPoint\x = 10
  *Point.MyPoint\y = 20
  ProcedureReturn 1
EndProcedure
Код:
$tPoint = DllStructCreate('int x;int y')

$Ret = DllCall('q.dll', 'int', 'MyFunction', 'ptr', DllStructGetPtr($tPoint))
If (@error) Or (Not $Ret[0]) Then
	ConsoleWrite('Error!' @CR)
	Exit
EndIf

ConsoleWrite('x = ' & DllStructGetData($tPoint, 'x') & @CR)
ConsoleWrite('y = ' & DllStructGetData($tPoint, 'y') & @CR)
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
OffTopic:


Yashied [?]
Кстати, приколная штука этот PureBasic
Выбираю только лучшее! - именно по этому я и выбрал AutoIt и этот форум... ;)
))))

asdf8 [?]
ps: забыл - purebasic поддерживает потоки!
А вот многоядерность как-то снова стороной. Загрузка CPU на исполняемом файле PureBasic 25%.
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
OffTopic:

Yashied [?]
А еще, как я понял, в PureBasic можно создать ActiveX
А я понял что ActiveX в PureBasic реализовать невозможно?... сам не разберался, мимолетом прочитал на каком-то форуме.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
[?]
Цитата сказал(а):
Цитата: asdf8 от Сегодня в 15:45:13
минусы: платный, ...
Хмм...
Понимаю, что нас это не остановит :smile:

Тогда заменю этот пункт на: плохая совместимость версий
 

asdf8

Скриптер
Сообщения
564
Репутация
152
[?]
Цитата сказал(а):
Цитата: asdf8 от Сегодня в 17:01:36
плохая совместимость версий...
Можешь пояснить?
Исходники для одной версии PureBasic с большой долей вероятности не скомпилируются на другой версии (тут все гораздо, гораздо хуже чем в AutoIt)

Вообще была задумка понаделать для PureBasic аналоги автоитовских функций, что-то уже сделал, что-то недоделал, до чегото никак руки не дойдут
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
asdf8 сказал(а):
Исходники для одной версии PureBasic с большой долей вероятности не скомпилируются на другой версии (тут все гораздо, гораздо хуже чем в AutoIt)
Да, половина примеров для PB на форуме не работает. Да и код как-то читается плохо. Вот смотрю на AutoIt, и все с первого взгляда понятно (GUICtrl..., Tray... и т.д.). А в PB все как-то через ж***. Но размер исполняемого файла...
 
Верх