Что нового

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

Kalisnik

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Код:
$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,724
Очень странный вопрос для того, кто собрался написать 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,724
Kalisnik, по PureBasic есть неплохой форум. Там ты можешь найти ответы на большинство вопросов.

P.S

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

asdf8

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

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

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

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

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

 

Yashied

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

А в других ЯП можно? Только структура...
 

asdf8

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

в срр можно, (из программы на срр :smile:, из AutoIt - затрудняюсь сразу ответить).

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В данный момент меня 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,724
asdf8 сказал(а):
Исходники для одной версии PureBasic с большой долей вероятности не скомпилируются на другой версии (тут все гораздо, гораздо хуже чем в AutoIt)

Да, половина примеров для PB на форуме не работает. Да и код как-то читается плохо. Вот смотрю на AutoIt, и все с первого взгляда понятно (GUICtrl..., Tray... и т.д.). А в PB все как-то через ж***. Но размер исполняемого файла...
 
Верх