purebasic.info

PureBasic forum
Текущее время: Вс ноя 19, 2017 3:19 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Сб окт 14, 2017 10:57 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
kolya писал(а):
Вы можете перевиденный вами код прокомментировать, дополнить и прописать в процедуры отсутствующий код.
Я понятия не имею как устроены плагины NeoBook. В архиве nbwpluginsdk.zip есть файл NeoBook Plug-In SDK.chm где написано об устройстве плагинов и для чего нужна каждая из процедур.


Ну хотя-бы прописанный вами код прокомментировать вы можете?(вы же когда его писали представление имели что пишите).

Пётр писал(а):
kolya писал(а):
В сполере переведенный вами код, с моей формой окна.
Процедура EditMyMessageBox() нигде не вызывается.

Подскажите если не трудно, тогда примером создание формы в длл, и как её вызвать из процедуры какими параметрами.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб окт 14, 2017 11:18 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
Что там комментировать? Что такое ProcedureDLL и подобное? Об этом написано в справке. На форуме можно найти переведенную на русский. viewtopic.php?p=87776#p87776

kolya писал(а):
как её вызвать из процедуры какими параметрами
Нужно вставить EditMyMessageBox() в то место где должна вызываться процедура создания окна.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс окт 15, 2017 12:23 am 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Что там комментировать? Что такое ProcedureDLL и подобное? Об этом написано в справке. На форуме можно найти переведенную на русский. viewtopic.php?p=87776#p87776


Процедура в длл.
Код:
1
2
3
4
5
6
7
8
9
10
11
 
ProcedureDLL my_Funkc(IDNum)
    Select IDNum
    Case 1
      MessageRequester("Hello", "Case 1", 0)
    Case 2  
      MessageRequester("Hello", "Case 2", 0)  
  EndSelect
  ProcedureReturn 0
  EndProcedure
 



Вызов процедуры, пример вывода Окна Сообщения.
Если CallFunction(0, "my_Funkc",1)то сообщение будет "Case 1". Если CallFunction(0, "my_Funkc",2)то сообщение будет "Case 2".
Код:
1
2
3
4
5
6
 
  If OpenLibrary(0, "NeoBook_Test.dll")
    CallFunction(0, "my_Funkc",1)
    CloseLibrary(0)
  EndIf
 



А это ваш пример. Что сюда (*Params.pCharArray) помещать или считывать ?,
что значит * ?, и как понять нормальным языком это *Params.pCharArray
Код:
1
2
3
4
5
6
7
8
 
ProcedureDLL nbEditAction(IDNum, *Params.pCharArray)
  Select IDNum
    Case 1
EndSelect
  ProcedureReturn #True
EndProcedure
 




Пётр писал(а):
kolya писал(а):
как её вызвать из процедуры какими параметрами
Нужно вставить EditMyMessageBox() в то место где должна вызываться процедура создания окна.


Я протупил, назначил Procedure EditMyMessageBox() в место ProcedureDLL EditMyMessageBox()
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
ProcedureDLL EditMyMessageBox()
 
;{Здесь обьявляем перименные и константы для окна и гаджетов на нём
 Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Enumeration
  #Button_0    ;Кнопка выход.
  #Button_1    ;Кнопка применить.
  #Stroka_1    ;Константа для вывода текста, в Заголовок Окна
  #Stroka_2    ;Константа для вывода текста, в Сообщение Окне
  #Text_1
  #Text_2
EndEnumeration
;}
 
;{Здесь создадим форму, и различные гаджеты на ней
If OpenWindow(0, 450, 200, 306, 215, "Вывести сообщение в Windows", #PB_Window_TitleBar|#PB_Window_SystemMenu)
 ButtonGadget(#Button_0, 170, 160, 100, 25, "Выход");Кнопка выход.
  GadgetToolTip(#Button_0, "Закрыть Программу.");Всплывающая подсказка.
 ButtonGadget(#Button_1, 20, 160, 100, 25, "Применить");Кнопка применить.
  GadgetToolTip(#Button_1, "Применить изминения.");Всплывающая подсказка.
    StringGadget(#Stroka_1, 140, 15, 155, 25, "");Выводит Заголовок Окна.
    StringGadget(#Stroka_2, 140, 45, 155, 25, "");Выводит Сообщение в Окне.
    TextGadget(#Text_1, 5, 20, 110, 20, "Заголовок Окна")
    TextGadget(#Text_2, 5, 50, 130, 20, "Сообщение в Окне")
 ;}
 
;{Здесь показуе фору и обработуем событи гаджетов
 
HideWindow(0,0);
Repeat
 
  Event=WaitWindowEvent()
;Обработчик событий
If Event=#PB_Event_Gadget
 
;Здесь обработка кнопки Применить.  
  Select EventGadget()
     Case #Button_1              ; Кнопка применить.
;Здесь обработка кнопки выход
    Case #Button_0               ;Кнопка выход.
    Event=#PB_Event_CloseWindow
EndSelect
EndIf
 
Until Event=#PB_Event_CloseWindow
EndIf
EndProcedure
 
;}
 


Сейчас только увидел свою ошибку, в голове у меня уже каша, все перепуталось-перемешалось. :oops:
Окно вызывается так :D
Код:
1
2
3
4
5
6
 
  If OpenLibrary(0, "NeoBook_Test.dll")
    CallFunction(0, "EditMyMessageBox")
    CloseLibrary(0)
  EndIf
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс окт 15, 2017 3:33 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
kolya писал(а):
А это ваш пример. Что сюда (*Params.pCharArray) помещать или считывать ?,
Помещать должен NeoBook, а что считывать написано в файле NeoBook Plug-In SDK.chm из архива nbwpluginsdk.zip.
*Params.pCharArray это массив строк. Что в нем зависит от того что было переделано из NeoBook. Читайте документацию. В ней все написано.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс окт 15, 2017 6:01 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Благодарю за отклик. :arrow:
Пётр писал(а):
kolya писал(а):
А это ваш пример. Что сюда (*Params.pCharArray) помещать или считывать ?,
Помещать должен NeoBook, а что считывать написано в файле NeoBook Plug-In SDK.chm из архива nbwpluginsdk.zip.

Постораюсь гуглом перевисти.
Пётр писал(а):
*Params.pCharArray это массив строк. Что в нем зависит от того что было переделано из NeoBook. Читайте документацию. В ней все написано.

Вот это мне и не понятно было. :shock:

А вот этот * символ что делает ?, в справке не нашел, в гугле то-же нет. :?:

С толкнулся еще с таким, не понятным для меня моментом кода, помогите если можете.
Процедура nbExecAction, приходит текст из NeoBook, 2 параметра(1-й текст в заголовке окна, 2-й текст само сообщение).
Вопрос как мне эти 2 параметра считать и передать во внещьнюю процедуру, к примеру для вывода сообщения.
MessageRequester("Stroka_1", "Stroka_2", 0)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
ProcedureDLL nbExecAction(IDNum, *Params.pCharArray);Процедура DLL
Define.c Stroka_1,Stroka_2
Select IDNum
  Case 1
   
    ;так результат будет одинаков, в обоих перименных Stroka_1 и Stroka_2, ???
    Stroka_1 = *Params.pCharArray
    Stroka_2 = *Params.pCharArray
     
 CreateThread(@DisplayMyMessageBox(), 0);Вызываем функцию
 
EndSelect
  ProcedureReturn 0
 
EndProcedure
 



А вот в этом фрагменте кода, NB виснет с ошибкой(фото1)
Код:
1
2
3
4
5
6
7
8
9
 
ProcedureDLL nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint);Процедура о Плагине.
  nbWinHandle = WinHandle
 
  SetStr(*PlugInTitle, "Sample Plug-In");
  SetStr(*PlugInPublisher, "John Doe");
  SetStr(*PlugInHint, "Use this plug-in to display a Windows message box");
EndProcedure
 


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


Вложения:
Фото3.jpeg [457.46 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс окт 15, 2017 8:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
kolya писал(а):
А вот этот * символ что делает ?, в справке не нашел
https://www.purebasic.com/documentation ... emory.html

Данные в массиве, поэтому должно быть
Код:
1
2
Stroka_1 = *Params\Arr[0]
Stroka_2 = *Params\Arr[0]



Цитата:
Код:
1
CreateThread(@DisplayMyMessageBox(), 0);Вызываем функцию

Это создание потока, а не простой вызов функции. Действительно ли нужен поток?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс окт 15, 2017 10:43 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Цитата:
Код:
1
CreateThread(@DisplayMyMessageBox(), 0);Вызываем функцию

Это создание потока, а не простой вызов функции. Действительно ли нужен поток?

Думаю нужен.

Моё представление с перевода справки.
1.Идёт сначала регистрация плагина, автор,каткое описание плагина,иконка, фунции, и название плагина в NB.
2.Когда заходим в меню выбора плагина, кликаем по иконке, NB обращается к функции (nbEditAction или к этой nbExecAction, я пока не разобрался)в наш dll, с параметрами IDNum=1 и с переменными Params[текст заголовка], Params[текст сообщения], если этот вызов первый раз то они пустые, далее из этой процедуры нужно попасть в процедуру с формой(с этими данными для Params[текст заголовка], Params[текст сообщения]) для их редактирования, после их редактирования по нажатию кнопки "Применить" нужно из процедуры с формой с этими отредактированными(Params[текст заголовка], Params[текст сообщения]) данными попасть в процедуру(nbEditAction или к этой nbExecAction, я пока не разобрался) передачу их в NB, чтобы они сохранились.
Далее когда запускается NB, кликаем по нашей команде и в ответ из длл выводится сообщение с ранее редактированными нами данных.

Как то так я пока понял, но как это все в коде разместить пока загадка, да и плюс еще он даже не регистрируется, ошибку выводит(я выше писал), если-бы он хотя-бы зарегился, тогда было-бы легче остальной код править.
Сам уже который день сижу над кодом :shock: , и так и сяк не хрена не выходит, разобрался только как форму создать в процедуре и вызвать её от туда. Остаётся надеяться на не равнодушных людей, таких как вы.

Благодарю за вашу помощь, душевно.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс окт 15, 2017 11:33 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
kolya писал(а):
даже не регистрируется, ошибку выводит(я выше писал)
У меня NeoBook закрывается без сообщений об ошибках после вызова nbRegisterPlugIn.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн окт 16, 2017 7:31 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
kolya писал(а):
даже не регистрируется, ошибку выводит(я выше писал)
У меня NeoBook закрывается без сообщений об ошибках после вызова nbRegisterPlugIn.

А какая у вас версия PureBasic ?.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн окт 16, 2017 10:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
Собирал в 5.24 и 5.43.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн окт 16, 2017 11:54 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Собирал в 5.24 и 5.43.

Скиньте сюда или мне на почту asus-kolya@bigmir.net откомпилированный плагин вашей версией басика.
Попробую установить, может действительно дело в этом.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт окт 17, 2017 10:09 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
В архиве.


Вложения:
PlugIns.zip [8.14 KiB]
Скачиваний: 14

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 01, 2017 3:43 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
В архиве.

Добрый час Пётр.
Уже бьюсь который день с кодом, добился регистрации плагина в NB, но регистрируется только иконка, описание нет. Процесс пошел только тогда когда поменял перименных(тип) и в место ProcedureDLL поменял на ProcedureCDLL.
Не могли бы вы глянуть почему не передаются описания плагина в NB. И правильно ли я обращаюсь к функции xnbAddAction().
За ранее благодарен.
Код
Import "TESTPLUG.RES" : EndImport

#ACTIONPARAM_NONE = 0
#ACTIONPARAM_ALPHA = 1
#ACTIONPARAM_ALPHASP = 2
#ACTIONPARAM_NUMERIC = 3
#ACTIONPARAM_MIXED = 4
#ACTIONPARAM_FILENAME = 5
#ACTIONPARAM_VARIABLE = 6
#ACTIONPARAM_DATAFILE = 7

#MaxActionParams = 10

EnableExplicit

Structure pCharArray
Arr.s[#MaxActionParams]
EndStructure

Prototype AddActionProcType(IDNum.l, Name.s, Hint.s, *Params, NumParams.b)
Prototype AddFileProcType(s.s, AddFlag.l)
Prototype GetVarProcType(VarName.s, *Value.s)
Prototype SetVarProcType(VarName.s, *Value.s)
Prototype PlayActionProcType(s.s)
Prototype InterfaceProcType(InterfaceID.l, sData.s)

Global nbAddAction.AddActionProcType
Global nbAddFile.AddFileProcType
Global nbGetVar.GetVarProcType
Global nbSetVar.SetVarProcType
Global nbPlayAction.PlayActionProcType
Global nbInterface.InterfaceProcType
Global nbWinHandle.i
EnableASM


Procedure FreeStr(*S)
If *S<>0
GlobalFree_(*S)
*S=0
EndIf
EndProcedure

Procedure SetStr(*Dest, Source.S)
If *Dest<>0
FreeStr(*Dest)
EndIf

*Dest = GlobalAlloc_(#GMEM_FIXED, Len(Source) + 1)

PokeS(*Dest, Source)
MessageRequester(Str(*Dest),Source)

EndProcedure

Procedure xnbAddAction(IDNum.l, Name.s, Hint.s, *Params, NumParams.b)


PUSH eax
XOR eax,eax
MOV al,NumParams
PUSH eax
PUSH eax

nbAddAction(IDNum,Name,Hint,*Params, NumParams)

POP eax



EndProcedure

Procedure FatalError()
Protected Message.s

Message="В прораме "+Chr(34)+GetFilePart(ProgramFilename())+Chr(34)+" произошла ошибка."+#CRLF$+#CRLF$
Message+"Файл: "+#TAB$+Chr(34)+GetFilePart(ErrorFile())+Chr(34)+#CRLF$
Message+"Строка: "+#TAB$+Str(ErrorLine())+#CRLF$
Message+"Тип: "+#TAB$+Chr(34)+Trim(ErrorMessage())+Chr(34)+#CRLF$+#CRLF$
Message+"Сообщите об этом разработчику программы для устранения этой ошибки."
MessageRequester("Ошибка", Message, #MB_OK|#MB_ICONERROR)

EndProcedure


ProcedureCDLL nbEditAction(IDNum, *Params.pCharArray)

MessageRequester("","nbEditAction")
Select IDNum
Case 1
EndSelect

ProcedureReturn #True
EndProcedure


ProcedureCDLL nbExecAction(IDNum, *Params.pCharArray)

MessageRequester("","nbExecAction")
Select IDNum
Case 1
EndSelect

ProcedureReturn 0

EndProcedure


ProcedureCDLL nbMessage(MsgCode, Reserved)

MessageRequester("","nbMessage")
Select MsgCode
Case 1
Case 2
Case 3
Case 4
Case 5
Case 6
EndSelect

EndProcedure


ProcedureCDLL nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
nbWinHandle = WinHandle

SetStr(*PlugInTitle, "Тестовый");
SetStr(*PlugInPublisher, "Плагин");
SetStr(*PlugInHint, "Первый");

EndProcedure


ProcedureCDLL nbRegisterScriptProcessor(*PlayActionProc)
nbPlayAction = *PlayActionProc
EndProcedure


ProcedureCDLL nbRegisterInterfaceAccess(*InterfaceProc)
nbInterface = *InterfaceProc
EndProcedure


ProcedureCDLL nbRegisterPlugIn(*AddActionProc, *AddFileProc, *VarGetFunc, *VarSetFunc)


nbGetVar=*VarGetFunc
nbSetVar= *VarSetFunc
nbAddAction= *AddActionProc
nbAddFile=*AddFileProc


xnbAddAction( 2, "Переход на страницу", "Перейти на указаную страницу.",#ACTIONPARAM_NONE, 0 );


EndProcedure



ProcedureDLL AttachProcess(Instance) ; Загрузка плагна
OnErrorCall(@FatalError())
MessageRequester("","AttachProcess")
EndProcedure

ProcedureDLL DetachProcess(Instance) ; Выгрузка плагина.
MessageRequester("","DetachProcess")
EndProcedure


Вложения:
1.jpeg [416.58 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 01, 2017 11:37 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
что за бред с асм? :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
Procedure xnbAddAction(IDNum.l, Name.s, Hint.s, *Params, NumParams.b)
 
PUSH eax
XOR eax,eax
MOV al,NumParams
PUSH eax
PUSH eax
 
nbAddAction(IDNum,Name,Hint,*Params, NumParams)
 
POP eax
EndProcedure
 


так да уж нужно так
Код:
1
2
3
4
5
6
7
 
Procedure xnbAddAction(IDNum.l, Name.s, Hint.s, *Params, NumParams.b)
 
nbAddAction(IDNum,Name,Hint,*Params, NumParams)
 
EndProcedure
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср ноя 01, 2017 11:48 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
В примерах про этот "бред" написано следующее.
Цитата:
Do not edit. This is to match Delphi's calling conventions.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB