Что нового

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

Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Yashied
Может даже вот так попробовать:
Код:
Procedure Core1(*Param.Arr)
  For i = 0 To 999
    If *Param\Value[i] = #False
      *Param\Value[i] = *Param\Value[i] / 2
    EndIf
  Next
EndProcedure

Procedure Core2(*Param.Arr)
   For i = 1 To 999
     If *Param\Value[i] = #False
       *Param\Value[i] = *Param\Value[i] / 2
     EndIf
   Next
EndProcedure

Procedure Core3(*Param.Arr)
   For i = 2 To 999
     If *Param\Value[i] = #False
       *Param\Value[i] = *Param\Value[i] / 2
     EndIf
   Next
EndProcedure

Procedure Core4(*Param.Arr)
   For i = 3 To 999
     If *Param\Value[i] = #False
       *Param\Value[i] = *Param\Value[i] / 2
     EndIf
   Next
EndProcedure
В теории: если одно или два ядра окажутся загруженными сторонними процессами, то их функцию возьмут на себя менее загруженные ядра CPU.
На практике: подозреваю что так код будет работать медленнее если вообще будет. Потому как я не знаю что будет если два потока одновременно обратятся к одной переменной... :laugh: (код запускать не пробовал) )) Для верности здесь нужно что-то подобное как @error в AutoIt. :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я не уверен, что это вобще будет как-то распараллелено. Там есть целая теория, как Windows распределяет потоки. Если ядро будет сильно загружено, то да, система перекинет поток на другое ядро. А так, я подозреваю, что этот код будет выполнен на двух ядрах: основной код (AutoIt) + еще одно на все 4 потока. Попробуй...

:smile:

P.S

Есть еще функция SetThreadAffinityMask(), которая позволяет раскидывать потоки по ядрам.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
asdf8 сказал(а):
Лучше об этом спросить на форуме РВ.

Я тут слышал, что без купленной лицензии особо ничего там и не спросишь... Банят однако черти.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Цитата [?]
без купленной лицензии особо ничего там и не спросишь

Это может на оффоруме, хотя вряд ли - есть бесплатная демо версия, с урезанным функционалом, ее тоже надо поддерживать - замануха.
А на русских форумах ту лицензию точно имели... в виду.

ps по поводу "банят" - меня тоже последнее время через раз этот форум банит, запарился уже куки чистить
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Yashied
Еще хотел спросить... после того как функция Dll завершается, все ее значения затираются из памяти(соответственно все переменные обнуляются?)? Если я один раз открою dll-бидлиотечку и буду вызывать ее функцию в цикле, то ни каких утечек памяти не будет?
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
asdf8 [?]
ps по поводу "банят" - меня тоже последнее время через раз этот форум банит, запарился уже куки чистить

Какой? - хттп://www.purebasic.fr/english/, да?
Незнаю, я там регнулся, чтоб спросить об одной проблеме, так мне сразу оперативно помогли ее решить(несмотря даже на то, что я типа не в тот раздел постанул) и про лицензию никто ниче не спрашивал, да и сомневаюсь я что при запуске PB IDE, она в инет лезет спалить АЙпишник, у меня то файрволл всегда включен и там даже осел забанен...
 

Yashied

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

Да хоть двадцать раз подряд открой, все будет OK. А если ты выделяешь для чего-нибудь память, то ее перед завершением функции естественно нужно освободить. Например, AllocateMemory() => FreeMemory(). Это есть в этом примере.
 
Автор
K

Kalisnik

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

Нашел русскую справку для PureBasic - если кому-нибудь нужна, могу выложить.
 

asdf8

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

Sp01LeR
Я подразумевал не тот форум ( по РВ), а этот (autoit-script.ru).
Правда сейчас все вроде нормализовалось
 

asdf8

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


[?]
Цитата сказал(а):
Вот это новость

Это ничего страшного, тем более, что сейчас все в порядке.
Просто, в первом посте, где писал об этом, хотел сказать, что в интернете бывают всякие глюки, некоторые из которых рассасываются сами собой.
А так, у меня был только один случай, когда один сайт качественно забанил, с какого-то перепугу, весь диапазон IP моего провайдера.
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Решил свой вопрос в этой теме добавить.
Есть dll написанная на PowerBasic, хочу подключить ее, но не выходит, впервые начал работать с dll.

На PB она подключается так:
Код:
   DECLARE FUNCTION SetHook LIB "HookD.Dll" ALIAS "SetHook" (hWnd AS LONG) AS LONG
и вызывается так:
Код:
         CASE %WM_INITDIALOG: SetHook CBHNDL
         CASE %WM_DESTROY   : hHook = GetProp(CBHNDL, BYVAL 1): IF hHook THEN UnhookWindowsHookEx hHook
в самой dll:
Код:
FUNCTION SetHook ALIAS "SetHook" ( hWnd AS LONG) EXPORT AS LONG

Насколько я понимаю нужно вызвать функции из dll с параметром hWnd.
По идее что то вроде, кода ниже:
Код:
$dll = DllOpen("HookD.Dll")
$result = DllCall($dll, "", "SetHook",'long',"whnd")
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
r35p3ct [?]
Есть dll написанная на PowerBasic, хочу подключить ее, но не выходит, впервые начал работать с dll.

Код функции в DLL:
Код:
ProcedureDLL NameProcedure(Variable.l) ;Через эту переменную Variable, данные передаются В DLL. Количество переменных не ограничено и указывается через запятую.
    ProcedureReturn YourVariable.l ;Возвращаемое процедурой значение.
EndProcedure

Код вызова в AutoIt:
Код:
$dll = DllOpen("HookD.Dll")
$result = DllCall($dll, "long", "NameProcedure", "long", $whnd) ;Во втором значении указывается тип возращаемой переменной (в данном случае я указал "long"). Переменная в конце присваивает значение переменной указанной в имени Dll функции - конкретно Variable.
DllClose($dll)
 

xahik

Новичок
Сообщения
6
Репутация
1
asdf8 сказал(а):
нельзя передать массив в функцию находящуюся в dll написанную на purebasic.
А вот и не правда!
Массив можно представить как некоторое количество ячеек памяти.
Кто или что запрещает работать с этой памятью?

DLL:
Код:
ProcedureDLL Example(*MyArray, LenArray)
  For i=0 To LenArray
    PokeL(*MyArray + i*4,  i)
  Next i
EndProcedure

Вызов DLL:
Код:
Dim MyArray.l(10)
If OpenLibrary(0,"ExampleDLL.dll")
  CallFunction(0,"Example", @MyArray(), ArraySize(MyArray()))
  
  For i=0 To ArraySize(MyArray())
    Debug MyArray(i)
  Next i
  
  CloseLibrary(0)
Else
  MessageRequester("", "Нет DLL")
EndIf
 

asdf8

Скриптер
Сообщения
564
Репутация
152
А вот и не правда!
Массив можно представить как некоторое количество ячеек памяти

кто бы спорил, только смысл использования массивов - в совокупности их свойств: тип данных, размер, размерность и "правильно" передаваться они должны одной переменной - обычно указателем. В РВ тип данных и размер вшиты в первые 8 байт массива и чтение памяти здесь поможет, а вот размерность массива хранится в программе в виде переменной и передавать его надо отдельно. Я - это имел в виду.

ps: вообще-то в РВ чаще используют структуры и мапы, судя по скудному набору функций для работы с массивами и практически все эти функции корректно работают только с одномерными массивами.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я, после того, как написал Copy UDF, забил на этот PureBasic. Постоянная каша с определением типов через "." просто убивает... IMHO, если человек начинает изучать программирование с PureBasic, то в последствии перейти на какой-нибудь более толковый ЯП, будет ооооочень непросто. А о "гаджетах" я вообще лучше промолчу. А еще там очень бестолковая справка. Вроде, на первй взгляд, все, что необходимо, написано, красиво оформлена, а на деле от нее очень мало толку.

P.S

А вот после AutoIt, особенно, если вы часто используете родные его функции, переходить на другой ЯП уже не захочется. Например, попробуйте написать на C# или том же PB функцию WinWait()...

:smile:
 
Верх