PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » DataSection в Dll. Получение параметров из Dll


DataSection в Dll. Получение параметров из Dll

Сообщений 1 страница 9 из 9

1

Есть вопрос. Имеется функция следующего вида:

ProcedureDLL.d MyFunction(Array Param.d(1))
   ProcedureReturn f(Param(1), Param(2) ... Param(n))
EndProcedure

Нужно, чтобы при загрузке такой библиотеки, можно было передать в программу некоторую информацию по функции. Например число "n", или область допустимых значений Param(i). Я так думаю, инфу можно хранить в DataSection, но не представляю как её потом извлекать. Заранее спасибо.

0

2

Мало что понял из вопроса. Код внес еще больше непоняток. Скажем, хз что такое f(), из кода непонятно.
Лучше используй не массив а структуру.

0

3

Извините за некорректный вопрос.
Суть следующая: есть библиотека. В ней есть функция (или несколько). В функцию передается серия параметров Param(1), Param(2) ... Param(n) (я оформил это как передачу массива, переправлю на структуру). Подгрузив такую библиотеку, программа должна знать длину такой серии. Например, для функции Random() достаточно передать только Param(0). Получится

Код:
 ProcedureDLL.d MyRandom(Array Param.d(1))
   ProcedureReturn Random(Param(0))
EndProcedure

Для более сложных функций параметров нужно больше. Задача такая: загружая библиотеку, параллельно получить размер этого массива.

0

4

Код:
Structure Stuct
  List Param.d()
EndStructure

ProcedureDLL.d MyRandom(*Param.Stuct)
  Size = ListSize(*Param\Param())
  If Size>0
    SelectElement(*Param\Param(), 0)
    ProcedureReturn Random(*Param\Param())
  EndIf
EndProcedure

0

5

Я понял. В данной ситуации, программа, открывающая Dll, выглядела бы так

Код:
Structure Stuct
  List Param.d()
EndStructure

Prototype.d Func(*Param.Stuct)

If OpenLibrary(0, "1.dll")
  DllFunction.Func=GetFunction(0, "MyRandom")
  
  Var.Stuct
  AddElement(Var\Param()) ;!!!
  Var\Param()=10

  For i=0 To 20 : Debug DllFunction(@Var) : Next
  CloseLibrary(0)
EndIf

Но в таком случае актуальное число параметров должно быть заранее прописано внутри кода. Мне же важно получить его из вне. Это нужно для большей универсальности, т. к. я планирую использовать много подобных библиотек, и для меня важна их взаимозаменяемость.

0

6

Тигрёнок написал(а):

Но в таком случае актуальное число параметров должно быть заранее прописано внутри кода.

Где оно прописано внутри кода?
Эта строка ни о чем не говорит?

Код:
Size = ListSize(*Param\Param())

0

7

А как же AddElement(Var\Param())?
Сколько таких процедур должно быть в коде зависит только вида функции внутри Dll.

Если взять другую функцию

Код:
Structure Stuct
  List Param.d()
EndStructure

ProcedureDLL.d MyRandom2(*Param.Stuct)

Size = ListSize(*Param\Param())
  If Size>0
    SelectElement(*Param\Param(), 0)
    A.d=*Param\Param()
    SelectElement(*Param\Param(), 1)
    B.d=*Param\Param()
    ProcedureReturn A*2*(Random(B)/B-0.5)
  EndIf
EndProcedure

То процедура открытия выглядела бы так

Код:
Structure Stuct
  List Param.d()
EndStructure

Prototype.d Func(*Param.Stuct)

If OpenLibrary(0, "1.dll")
  DllFunction.Func=GetFunction(0, "MyRandom")
  
  Var.Stuct
  AddElement(Var\Param()) ; - !!!
  Var\Param()=10
  AddElement(Var\Param()) ; - !!!
  Var\Param()=2

  For i=0 To 20 : Debug DllFunction(@Var) : Next
  CloseLibrary(0)
EndIf

И таких AddElement(Var\Param()) может быть скольугодно много. По этому данный блок должен выглядеть так

Код:
For i=0 to n
  AddElement(Var\Param())
  Var\Param()=i 
Next

Где n заранее не известно. Его нужно получить загружая библиотеку, а для этого оно должно где-то храниться. Именно по этому я спрашиваю про DataSection.

Отредактировано Тигрёнок (10.07.2012 11:21:27)

0

8

Ну так добавь в DLL функцию типа InitDLL, которой будешь передавать указатель на структуру и функция ее заполнит сообщив таким образом о параметрах DLL.
По такому принципу работают многие плагины.

0

9

Да? Так просто?? А я голову морочил. Извините что так отнял время. Больше не буду задавать таких вопросов)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » DataSection в Dll. Получение параметров из Dll