purebasic.info

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

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




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

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
В примерах про этот "бред" написано следующее.
Цитата:
Do not edit. This is to match Delphi's calling conventions.

Перевод: Не редактировать. Это должно соответствовать соглашения о вызовах Delphi.
Это пол беды"бред", в исходнике на делфи я этот пункт закоментировал и откомпилировал плагин, и он без него устанавливается, только нет вызова процедуры из DLL, описание его и иконка устанавливаются.
Для меня сейчас главное-непонятно почему не передаётся описание в NB из плагина, до моего извращения с вашим кодом, NB отказывался даже иконку устанавливать.
ваш код
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Procedure FreeStr(*S.Integer)
  If *S<>0 And *S\i<>0
    GlobalFree_(*S\i)
    *S\i=0
  EndIf
EndProcedure
 
Procedure SetStr(*Dest.Integer, Source.s)
  If *Dest
    FreeStr(*Dest)
    If Len(Source)>0
      *Dest\i = GlobalAlloc_(#GMEM_FIXED, Len(Source) + 1)
      If *Dest\i
        PokeS(*Dest\i, Source)
      EndIf
    EndIf
  EndIf
EndProcedure
 


моё редактирование
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Procedure FreeStr(*S)
  If *S<>0
    GlobalFree_(*S)
    *S=0
  EndIf
EndProcedure
 
Procedure SetStr(*Dest, Source.S)
 
    FreeStr(*Dest)
 
      *Dest = GlobalAlloc_(#GMEM_FIXED, Len(Source) + 1)
 
 PokeS(*Dest, Source);пишем строку в указанный адрес памяти.
 
EndProcedure
 


После моего изменения,иконка установилась, а вот описание не в какую. :(
Я пробовал считывать из памяти, что вертается от сюда Procedure SetStr, сюда ProcedureCDLL nbInitPlugIn, фото посмотрите пожалуйста, так и должно быть?.

А вы не знаете как в пурике NIL (Значение не присвоенного указателя) объявить, это ведь не просто "0" ?, там в примерах оно используется в этих процедурах, только на разных языках по разному пишется.


Вложения:
Комментарий к файлу: SetStr(*PlugInTitle, "Тестовый")
В заголовке окна адрес памяти.
В окне текст.

1.jpeg [694.85 KiB]
Скачиваний: 0
Комментарий к файлу: SetStr(*PlugInPublisher, "Плагин")
В заголовке окна адрес памяти.
В окне текст.

2.jpeg [696.41 KiB]
Скачиваний: 0
Комментарий к файлу: SetStr(*PlugInHint, "Первый")
В заголовке окна адрес памяти.
В окне текст.

3.jpeg [694.95 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 02, 2017 12:38 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
Пётр писал(а):
В примерах про этот "бред" написано следующее.
Цитата:
Do not edit. This is to match Delphi's calling conventions.

Если там при вставках кода на асм,со стеком после всё будет нормально
то тогда думаю чтобы работало нужно так
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Procedure xnbAddAction(IDNum.l, Name.s, Hint.s, *Params, NumParams.b)
 
!PUSH eax
!XOR eax,eax
!MOV al,[p.v_NumParams+4]
!PUSH eax
!PUSH eax
 
 
nbAddAction(IDNum,Name,Hint,*Params, NumParams)
 
!POP eax
EndProcedure
 


Ну или может сделать EnableASM-DisableASM
также вопрос по аргументу,он действительно с типом .b(байт)
и как передаётся этот аргумент в стек на делфи,в пурике он всё равно передаётся как интегер(в стеке 4 байта)


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11054
Благодарил (а): 4 раз.
Поблагодарили: 379 раз.
Код на Си с асм вставкой
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
/**/void nbAddAction(int IDNum,char* Name, char* Hint,char Params[],BYTE NumParams){
//////Do not edit.  This is to match Delphi's calling conventions.
/**/__asm{
/**/    push eax
/**/    xor eax,eax
/**/    mov al,NumParams
/**/    push eax
/**/    push eax
/**/}
/**/xnbAddAction(IDNum,Name,Hint,Params);
/**/__asm pop eax;
/**/}
 


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


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

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
также вопрос по аргументу,он действительно с типом .b(байт)
и как передаётся этот аргумент в стек на делфи,в пурике он всё равно передаётся как интегер(в стеке 4 байта)


Добрый час вам Пётр, попробую ваш пример.
В делфи я вставил в процедурах вывод всплывающих сообщений, что-бы видеть что куда передается(хотя-бы минимально), так вот из процедуры ProcedureCDLL nbInitPlugIn() идет обращение в SetStr(), обрабатывается и всплывает сообщение c тем что обработано, MessageRequester("Указатель На память", "Память строки : " +Str(*Dest) +" | Текст строки в памяти : "+Source), но после возвращения назад в процедуру ProcedureCDLL nbInitPlugIn() считываю эту-же строку из памяти temp = PeekS(*PlugInPublisher), вывожу сообщения MessageRequester("Указатель *PlugInPublisher", "Память : " +Str(*PlugInPublisher) +" | Текст строки в памяти : "+temp), тут отображаются крокозябры, а в делфи нет там текст, как в процедуре SetStr() так и ProcedureCDLL nbInitPlugIn() текст присутствует.
Я думаю ошибка именно где то в процедуре SetStr(), первое что бросилось в глаза это NIL (Значение не присвоенного указателя), во многих примерах SDK он присутствует и не равен 0.
Процедура SetStr() в делфи
Код:
1
2
3
4
5
6
7
8
9
 
{*}PROCEDURE SetStr( VAR Dest : PChar; CONST Source : STRING );
{*}BEGIN
{*}  IF Dest <> NIL THEN GlobalFree( HGLOBAL( Dest ) );  
{*}  Dest := Pointer( GlobalAlloc( GMEM_FIXED, Length( Source )+1 ) );
{*}  StrCopy( Dest, PChar( Source ) );
    ShowMessage("StrCopy : "+(Source));
{*}END;
 


"он действительно с типом .b(байт)"
В конце 2 это-же байт ?, и объявление примеренной я так думаю, тоже байт (NumParams : BYTE).
Вот часть кода на делфи.
Код:
1
2
3
4
5
6
7
8
9
10
 
{*}TYPE TAddActionProc = PROCEDURE( IDNum      : INTEGER;
{*}                                 Name, Hint : PChar;
{*}                                 Params     : ARRAY OF BYTE;
{*}                                 NumParams  : BYTE );
{*}
{*}VAR  nbAddAction  : TAddActionProc;
 
   nbAddAction(1,"название функции","описание функции."[ACTIONPARAM_ALPHA,ACTIONPARAM_ALPHA],2);  
 



Последний раз редактировалось kolya Пт ноя 03, 2017 12:18 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 02, 2017 4:27 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
kolya писал(а):
В конце 2 это-же байт ?, и объявление примеренной я так думаю, тоже байт (NumParams : BYTE).
[

Не забывайте, что в Си BYTE = 0 до 255, а в PB BYTE = -125 до 125
Я обычно использую .a, там как раз от 0 до 255

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 02, 2017 4:48 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
kolya писал(а):
В конце 2 это-же байт ?, и объявление примеренной я так думаю, тоже байт (NumParams : BYTE).
[

Не забывайте, что в Си BYTE = 0 до 255, а в PB BYTE = -125 до 125
Я обычно использую .a, там как раз от 0 до 255


Чёт я тупанул :oops: , всё верно пишите, после шустрения по нету и прочтения кучи инфы по описанию перименных, разных языков программирования, уже туплю.


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

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вроде-бы нашёл ошибку, но все-же есть ещё ошибка, где не пойму.
Получается NB обращается к ProcedureCDLL nbInitPlugIn, от туда мчимся в SetStr(*PlugInTitle, "Test variant"), обработка(пишем в память, и с указателем опять обратно), 1-н раз всё Ок(крокозябр нет), повторно когда опять мчимся из той-же процедуры только с SetStr(*PlugInPublisher, "Home"), дальше ошибка, то есть в процедуру SetStr() данные приходят а из нейдут.

Гляньте кто нибудь почему передаётся из процедуры в процедуру только 1-н раз, дальше ошибка.
Вот так работает только один раз
Код:
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
 
Global temp.s
Procedure FreeStr(*S.Integer)
  If *S<>0 And *S\i<>0
    GlobalFree_(*S\i)
    *S\i=0
  EndIf
EndProcedure
 
 
Procedure SetStr(*Dest.Integer, Source.s)
 
  If *Dest
     FreeStr(*Dest)      
    If Len(Source) >0
      *Dest\i = GlobalAlloc_(#GMEM_FIXED, Len(Source) + 1)
      If *Dest\i
        PokeS(*Dest, Source)  ; если оставить так как перевёл Пётр (*Dest\i), то на выходе из процедуры одни крокозябры.
      EndIf
    EndIf
  EndIf
 
 MessageRequester("Процедура. SetStr", "Указатель : " +Str(*Dest) +" | Текст строки в памяти : "+Source)
 
EndProcedure
 
ProcedureCDLL nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
 
  nbWinHandle = WinHandle
 
  SetStr(*PlugInTitle, "Test variant")
  temp = PeekS(*PlugInTitle)
  MessageRequester("Процедура nbInitPlugIn :"+"*PlugInTitle", "Указатель : " +Str(*PlugInTitle) +" | Строка в памяти : "+temp)  
 
 SetStr(*PlugInPublisher, "Home");
 temp = PeekS(*PlugInPublisher)
 MessageRequester("Процедура nbInitPlugIn :"+"*PlugInPublisher", "Указатель : " +Str(*PlugInPublisher) +" | Строка в памяти : "+temp)
 
  SetStr(*PlugInHint, "The first trial plug-in");
  temp = PeekS(*PlugInHint)
 MessageRequester("Процедура nbInitPlugIn :"+"*PlugInHint", "Указатель : " +Str(*PlugInHint) +" | Строка в памяти : "+temp)
 
EndProcedure
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт ноя 03, 2017 2:57 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
Не забывай указать при компиляции что это в ASCII ,и то что последние версии пурика вроде как его не поддерживают, и тогда возможно если так то что бы плагин работал нужно конвертировать код входа выхода? :roll:
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
 
Procedure copystrASCI_Vmemory(*stroka,*stroka1)
  !mov dword esi,[esp+8]
  !mov dword edi,[esp+4]
  !cmp byte [esi],0;память под принимающую строку выделена?
  !jz exsit1
 
  !cikl:
 !cmp byte [edi],0
  !jz exsit
  !mov byte al,[esi]
  !mov byte[edi],al
  !inc esi
  !inc edi
  !jmp cikl
  !exsit:
 !mov byte[edi],0
  !exsit1:
 !retn 8
EndProcedure
 
Procedure FreeStr(*S);указатель на строку
 
    If *S<>0;если память под строку была выделена
        GlobalFree_(*S);то очищаем её
    EndIf
    *S=0;адрес на память=0
EndProcedure
 
 
Procedure SetStr(*Dest,*Source)
 
  FreeStr(*Dest);первоначально перед выделением памяти под строку,проверяем на на личее предыдущей
    ;;;=========================
 
  ;http://www.frolov-lib.ru/books/bsp/v13/ch2_3.htm
  ;*Dest=GlobalAlloc_(#GMEM_FIXED,Len(*Source)+1);выделяем память под строку+ байт под завершающий 0
 
 
*Dest=GlobalAlloc_(#GMEM_FIXED,MemoryStringLength(*Source,#PB_Ascii)+1);выделить память под строку + под завершающий байт (0)
 
 ;;===========================
copystrASCI_Vmemory(*Dest,*Source)
 
 
;strcpy(*Dest,*Source);функция копирования строки с завершающим 0
;char *strcpy (char *dst, const char *src);
;dst — указатель на буфер назначения.
;src — указатель на исходную строку.
EndProcedure
 
 
 ;тест
Global stroka.s="12345"
stroka=UTF16_ASCII(stroka);перевод в ascii для теста так как компилю в юникоде
 
 Global *mem
 SetStr(*mem,@stroka)
 
 Debug PeekS(*mem,-1,#PB_Ascii)
 
 FreeStr(*mem)
endprocedure
 
 



Правда при Debug PeekS(*mem,-1,#PB_Ascii) вылетает,видимо с адресацией что то не то(посмотрю попозже) :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт ноя 03, 2017 2:41 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сергейчик писал(а):
Не забывай указать при компиляции что это в ASCII ,и то что последние версии пурика вроде как его не поддерживают, и тогда возможно если так то что бы плагин работал нужно конвертировать код входа выхода? :roll:
Ваш код
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
 
Procedure copystrASCI_Vmemory(*stroka,*stroka1)
  !mov dword esi,[esp+8]
  !mov dword edi,[esp+4]
  !cmp byte [esi],0;память под принимающую строку выделена?
  !jz exsit1
 
  !cikl:
 !cmp byte [edi],0
  !jz exsit
  !mov byte al,[esi]
  !mov byte[edi],al
  !inc esi
  !inc edi
  !jmp cikl
  !exsit:
 !mov byte[edi],0
  !exsit1:
 !retn 8
EndProcedure
 
Procedure FreeStr(*S);указатель на строку
 
    If *S<>0;если память под строку была выделена
        GlobalFree_(*S);то очищаем её
    EndIf
    *S=0;адрес на память=0
EndProcedure
 
 
Procedure SetStr(*Dest,*Source)
 
  FreeStr(*Dest);первоначально перед выделением памяти под строку,проверяем на на личее предыдущей
    ;;;=========================
 
  ;http://www.frolov-lib.ru/books/bsp/v13/ch2_3.htm
  ;*Dest=GlobalAlloc_(#GMEM_FIXED,Len(*Source)+1);выделяем память под строку+ байт под завершающий 0
 
 
*Dest=GlobalAlloc_(#GMEM_FIXED,MemoryStringLength(*Source,#PB_Ascii)+1);выделить память под строку + под завершающий байт (0)
 
 ;;===========================
copystrASCI_Vmemory(*Dest,*Source)
 
 
;strcpy(*Dest,*Source);функция копирования строки с завершающим 0
;char *strcpy (char *dst, const char *src);
;dst — указатель на буфер назначения.
;src — указатель на исходную строку.
EndProcedure
 
 
 ;тест
Global stroka.s="12345"
stroka=UTF16_ASCII(stroka);перевод в ascii для теста так как компилю в юникоде
 
 Global *mem
 SetStr(*mem,@stroka)
 
 Debug PeekS(*mem,-1,#PB_Ascii)
 
 FreeStr(*mem)
endprocedure
 
 


Правда при Debug PeekS(*mem,-1,#PB_Ascii) вылетает,видимо с адресацией что то не то(посмотрю попозже) :roll:


Душевно за вашу проделанную работу, но результат тот-же что и с кодом который привёл Пётр(те-же крокозябры).
PureBasic у меня 4.51

Вот плагин с вставкой вашего кода.
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
 
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.i, Name.s, Hint.s, *Params, NumParams.a)
Prototype AddFileProcType(s.s, AddFlag.a)
Prototype GetVarProcType(VarName.s, *Value.s)
Prototype SetVarProcType(VarName.s, *Value.s)
Prototype PlayActionProcType(s.s)
Prototype InterfaceProcType(InterfaceID.i, sData.s)
 
Global nbAddAction.AddActionProcType
Global nbAddFile.AddFileProcType
Global nbGetVar.GetVarProcType
Global nbSetVar.SetVarProcType
Global nbPlayAction.PlayActionProcType
Global nbInterface.InterfaceProcType
Global nbWinHandle.i
Global temp.s
EnableASM
 
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
 
Procedure copystrASCI_Vmemory(*stroka,*stroka1)
  !mov dword esi,[esp+8]
  !mov dword edi,[esp+4]
  !cmp byte [esi],0;память под принимающую строку выделена?
  !jz exsit1
 
  !cikl:
 !cmp byte [edi],0
  !jz exsit
  !mov byte al,[esi]
  !mov byte[edi],al
  !inc esi
  !inc edi
  !jmp cikl
  !exsit:
 !mov byte[edi],0
  !exsit1:
 !retn 8
EndProcedure
 
Procedure FreeStr(*S);указатель на строку
 
    If *S<>0;если память под строку была выделена
        GlobalFree_(*S);то очищаем её
    EndIf
    *S=0;адрес на память=0
EndProcedure
 
 
Procedure SetStr(*Dest,*Source)
MessageRequester("Процедура. SetStr", "Указатель 1 : " +Str(*Dest) +" | Указатель 2 : "+Str(*Source))
  FreeStr(*Dest);первоначально перед выделением памяти под строку,проверяем на на личее предыдущей
    ;;;=========================
 
  ;http://www.frolov-lib.ru/books/bsp/v13/ch2_3.htm
  ;*Dest=GlobalAlloc_(#GMEM_FIXED,Len(*Source)+1);выделяем память под строку+ байт под завершающий 0
 
 
*Dest=GlobalAlloc_(#GMEM_FIXED,MemoryStringLength(*Source,#PB_Ascii)+1);выделить память под строку + под завершающий байт (0)
 
 ;;===========================
copystrASCI_Vmemory(*Dest,*Source)
 
 
;strcpy(*Dest,*Source);функция копирования строки с завершающим 0
;char *strcpy (char *dst, const char *src);
;dst — указатель на буфер назначения.
;src — указатель на исходную строку.
EndProcedure
 
 
 ;тест
;Global stroka.s="12345"
;stroka=UTF16_ASCII(stroka);перевод в ascii для теста так как компилю в юникоде
 
;Global *mem
 ;SetStr(*mem,@stroka)
 
 ;Debug PeekS(*mem,-1,#PB_Ascii)
 
;FreeStr(*mem)
;EndProcedure
 
; MessageRequester("Процедура. SetStr", "Указатель : " +Str(*Dest) +" | Текст строки в памяти : "+Source)
 
 
 
Procedure xnbAddAction(IDNum.i, Name.s, Hint.s, *Params, NumParams.a)
 
  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 nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
  ; MessageRequester("","nbInitPlugIn")
  Global stroka1.s="TEST variant"
  Global stroka2.s="Home"
  Global stroka3.s="The first trial plug-IN"
  nbWinHandle = WinHandle
 
SetStr(*PlugInTitle,@stroka1)
  temp = PeekS(*PlugInTitle)
  MessageRequester("1 Процедура nbInitPlugIn :"+"*PlugInTitle", "Указатель : " +Str(*PlugInTitle) +" | Строка в памяти : "+temp)
 
SetStr(*PlugInPublisher,@stroka2)  
 temp = PeekS(*PlugInPublisher)
 MessageRequester("2 Процедура nbInitPlugIn :"+"*PlugInPublisher", "Указатель : " +Str(*PlugInPublisher) +" | Строка в памяти : "+temp)
 
SetStr(*PlugInHint,@stroka3)
  temp = PeekS(*PlugInHint)
 MessageRequester("3 Процедура nbInitPlugIn :"+"*PlugInHint", "Указатель : " +Str(*PlugInHint) +" | Строка в памяти : "+temp)
 
EndProcedure
 
 
ProcedureCDLL nbRegisterScriptProcessor(*PlayActionProc)
 ;   MessageRequester("","nbRegisterScriptProcessor")
  nbPlayAction = *PlayActionProc
EndProcedure
 
 
ProcedureCDLL nbMessage(MsgCode, Reserved)
 
  MessageRequester("","nbMessage")
  Select MsgCode
    Case 1
    Case 2
    Case 3
    Case 4
    Case 5
    Case 6
  EndSelect
 
EndProcedure
 
 
ProcedureCDLL nbRegisterInterfaceAccess(*InterfaceProc)
;  MessageRequester("","nbRegisterInterfaceAccess")
  nbInterface = *InterfaceProc
EndProcedure
 
 
ProcedureCDLL nbRegisterPlugIn(*AddActionProc, *AddFileProc, *VarGetFunc, *VarSetFunc)
 ;  MessageRequester("","nbRegisterPlugIn")
 
nbGetVar=*VarGetFunc;
nbSetVar= *VarSetFunc;
nbAddAction= *AddActionProc; ?
nbAddFile=*AddFileProc
 
nbAddAction( 2, "Переход на страницу", "Перейти на указаную страницу.",#ACTIONPARAM_NONE, 0 );
 
EndProcedure
 
 
 
ProcedureDLL AttachProcess(Instance) ; Загрузка плагна
  OnErrorCall(@FatalError())
  MessageRequester(Str(Instance),"AttachProcess")
EndProcedure
 
ProcedureDLL DLLHandler(Instance) ; Выгрузка плагина.
  MessageRequester("","DetachProcess")
 
EndProcedure
 
 
 


Вот плагин который привёл Пётр, с малым редактированием.
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
 
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.i, Name.s, Hint.s, *Params, NumParams.a)
Prototype AddFileProcType(s.s, AddFlag.a)
Prototype GetVarProcType(VarName.s, *Value.s)
Prototype SetVarProcType(VarName.s, *Value.s)
Prototype PlayActionProcType(s.s)
Prototype InterfaceProcType(InterfaceID.i, sData.s)
 
Global nbAddAction.AddActionProcType
Global nbAddFile.AddFileProcType
Global nbGetVar.GetVarProcType
Global nbSetVar.SetVarProcType
Global nbPlayAction.PlayActionProcType
Global nbInterface.InterfaceProcType
Global nbWinHandle.i
Global temp.s
EnableASM
 
 
Procedure FreeStr(*S)
  If *S<>0
    GlobalFree_(*S)
    *S=0
  EndIf
EndProcedure
 
Procedure SetStr(*Dest.Integer, Source.S)
  MessageRequester("Процедура. SetStr", "Указатель : " +Str(*Dest) +" | Текст строки в памяти : "+Source)
  If *Dest
    FreeStr(*Dest)
    If Len(Source)
      *Dest\i = GlobalAlloc_(#GMEM_FIXED, Len(Source) + 1)
      If *Dest\i
; Было вот так  PokeS(*Dest\i, Source), но так крокозябры как и в вашем примере.
 PokeS(*Dest, Source)
      EndIf
    EndIf
  EndIf
EndProcedure
 
Procedure xnbAddAction(IDNum.i, Name.s, Hint.s, *Params, NumParams.a)
 
  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 nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
  ; MessageRequester("","nbInitPlugIn")
 
  nbWinHandle = WinHandle
 
 SetStr(*PlugInTitle,"TEST variant")
  temp = PeekS(*PlugInTitle)
  MessageRequester("1 Процедура nbInitPlugIn :"+"*PlugInTitle", "Указатель : " +Str(*PlugInTitle) +" | Строка в памяти : "+temp)
 
 SetStr(*PlugInPublisher,"Home");
 temp = PeekS(*PlugInPublisher)
 MessageRequester("2 Процедура nbInitPlugIn :"+"*PlugInPublisher", "Указатель : " +Str(*PlugInPublisher) +" | Строка в памяти : "+temp)
 
  SetStr(*PlugInHint,"The first trial plug-IN");
  temp = PeekS(*PlugInHint)
 MessageRequester("3 Процедура nbInitPlugIn :"+"*PlugInHint", "Указатель : " +Str(*PlugInHint) +" | Строка в памяти : "+temp)
 
EndProcedure
 
 
ProcedureCDLL nbRegisterScriptProcessor(*PlayActionProc)
 ;   MessageRequester("","nbRegisterScriptProcessor")
  nbPlayAction = *PlayActionProc
EndProcedure
 
 
ProcedureCDLL nbMessage(MsgCode, Reserved)
 
  MessageRequester("","nbMessage")
  Select MsgCode
    Case 1
    Case 2
    Case 3
    Case 4
    Case 5
    Case 6
  EndSelect
 
EndProcedure
 
 
ProcedureCDLL nbRegisterInterfaceAccess(*InterfaceProc)
;  MessageRequester("","nbRegisterInterfaceAccess")
  nbInterface = *InterfaceProc
EndProcedure
 
 
ProcedureCDLL nbRegisterPlugIn(*AddActionProc, *AddFileProc, *VarGetFunc, *VarSetFunc)
 ;  MessageRequester("","nbRegisterPlugIn")
 
nbGetVar=*VarGetFunc;
nbSetVar= *VarSetFunc;
nbAddAction= *AddActionProc; ?
nbAddFile=*AddFileProc
 
xnbAddAction( 2, "Переход на страницу", "Перейти на указаную страницу.",#ACTIONPARAM_NONE, 0 );
 
EndProcedure
 
 
ProcedureDLL AttachProcess(Instance) ; Загрузка плагна
  OnErrorCall(@FatalError())
  MessageRequester(Str(Instance),"AttachProcess")
EndProcedure
 
ProcedureDLL DLLHandler(Instance) ; Выгрузка плагина.
  MessageRequester("","DetachProcess")
 
EndProcedure
 


Первую строку SetStr(*PlugInTitle,"TEST variant") обрабатывает нормально(отсылает и возвращает назад в процедуру), а вот вторую SetStr(*PlugInPublisher,"Home") только отсылает в процедуру, и тут на возврате ошибка.


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
Исправил процедуру копирования,но как и предполагал не нравится мне что адрес выделенной памяти без возврата(хотя может и будет так работать? )
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
 
Procedure copystrASCI_Vmemory(*stroka,*stroka1)
  !mov dword esi,[esp+8]
  !mov dword edi,[esp+4]
  !cmp byte [edi],0;память под принимающую строку выделена?
  !jz exsit1
 
  !cikl:
 !cmp byte [esi],0
  !jz exsit
  !mov byte al,[esi]
  !mov byte[edi],al
  !inc esi
  !inc edi
  !jmp cikl
  !exsit:
 !mov byte[edi],0
  !exsit1:
 !retn 8
EndProcedure
 
Procedure FreeStr(*S);указатель на строку
 
    If *S<>0;если память под строку была выделена
        GlobalFree_(*S);то очищаем её
    EndIf
    *S=0;адрес на память=0
EndProcedure
 
 
Procedure SetStr(*Dest,*Source)
 
 ;;FreeStr(*Dest)
      If *Dest<>0;если память под строку была ранее выделена
        GlobalFree_(*Dest);то очищаем её
      EndIf
    ;;;=========================
 
  ;http://www.frolov-lib.ru/books/bsp/v13/ch2_3.htm
*Dest=GlobalAlloc_(#GMEM_FIXED,MemoryStringLength(*Source,#PB_Ascii)+1);выделяем память под строку+ байт под завершающий 0
 
 ;;===========================
copystrASCI_Vmemory(*Dest,*Source)
 ;Debug PeekS(*Dest,-1,#PB_Ascii)
 ;Debug Str(*Dest)
EndProcedure
 ProcedureCDLL nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
  ; MessageRequester("","nbInitPlugIn")
  Global stroka1.s=UTF16_ASCII("TEST variant");переводим в ASCI если компилим в юникоде
  Global stroka2.s=UTF16_ASCII("Home")
  Global stroka3.s=UTF16_ASCII("The first trial plug-IN")
  nbWinHandle = WinHandle
 
SetStr(*PlugInTitle,@stroka1)
  MessageRequester("1 Процедура nbInitPlugIn :"+"*PlugInTitle", "Указатель : " +Str(*PlugInTitle) +" | Строка в памяти : "+PeekS(@stroka1,-1,#PB_Ascii))
 
SetStr(*PlugInPublisher,@stroka2)  
 MessageRequester("2 Процедура nbInitPlugIn :"+"*PlugInPublisher", "Указатель : " +Str(*PlugInPublisher) +" | Строка в памяти : "+PeekS(@stroka2,-1,#PB_Ascii))
 
SetStr(*PlugInHint,@stroka3)
 MessageRequester("3 Процедура nbInitPlugIn :"+"*PlugInHint", "Указатель : " +Str(*PlugInHint) +" | Строка в памяти : "+PeekS(@stroka3,-1,#PB_Ascii))
 
EndProcedure
 
 ;тест
Global stroka.s="12345"
stroka=UTF16_ASCII(stroka);перевод в ascii для теста так как компилю в юникоде
 ;Debug PeekS(@stroka,-1,#PB_Ascii)
 
 
 Global *mem
 SetStr(*mem,@stroka)
 Debug *mem;Вот этот момент не понятен(нет возврата адреса выделенной памяти)
;Debug PeekS(*mem,-1,#PB_Ascii)
 
 FreeStr(*mem)
 
 


Вот наверное будет лучше так как независимо как компилим строка будет в ascii да и конвертировать её уже ненужно
Код:
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
 
ProcedureCDLL nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
  ; MessageRequester("","nbInitPlugIn")
 ; Global stroka1.s=UTF16_ASCII("TEST variant");переводим в ASCI если компилим в юникоде
  ;Global stroka2.s=UTF16_ASCII("Home")
  ;Global stroka3.s=UTF16_ASCII("The first trial plug-IN")
  nbWinHandle = WinHandle
 
SetStr(*PlugInTitle,?stroka1)
  MessageRequester("1 Процедура nbInitPlugIn :"+"*PlugInTitle", "Указатель : " +Str(*PlugInTitle) +" | Строка в памяти : "+PeekS(?stroka1,-1,#PB_Ascii))
 
SetStr(*PlugInPublisher,?stroka2)  
 MessageRequester("2 Процедура nbInitPlugIn :"+"*PlugInPublisher", "Указатель : " +Str(*PlugInPublisher) +" | Строка в памяти : "+PeekS(?stroka2,-1,#PB_Ascii))
 
SetStr(*PlugInHint,?stroka3)
 MessageRequester("3 Процедура nbInitPlugIn :"+"*PlugInHint", "Указатель : " +Str(*PlugInHint) +" | Строка в памяти : "+PeekS(?stroka3,-1,#PB_Ascii))
 
EndProcedure
 
 
Debug PeekS(?stroka3,-1,#PB_Ascii)
 
 
DataSection
  stroka1:
 !db 'TEST variant',0
  stroka2:
 !db 'Home',0
  stroka3:
 !db 'The first trial plug-IN',0
EndDataSection
 


И код по поводу хранения адреса на выделенную память(ведь адрес нужно сохранить для дальнейшей чистки памяти)
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
 
Procedure copystrASCI_Vmemory(*stroka,*stroka1)
  !mov dword esi,[esp+8]
  !mov dword edi,[esp+4]
  !cmp byte edi,0;память под принимающую строку выделена(адрес>0)?
  !jz exsit1;адрес=0
 
  !cikl:
 !cmp byte [esi],0
  !jz exsit
  !mov byte al,[esi]
  !mov byte[edi],al
  !inc esi
  !inc edi
  !jmp cikl
  !exsit:
 !mov byte[edi],0
  !exsit1:
 !retn 8
EndProcedure
 
Procedure FreeStr(*S);указатель на строку
 
    If *S<>0;если память под строку была выделена
        GlobalFree_(*S);то очищаем её
    EndIf
    ;*S=0;адрес на память=0
EndProcedure
 
 
Procedure SetStr(*Dest,*Source)
 
 ;;FreeStr(*Dest)
      If *Dest<>0;если память под строку была ранее выделена
        GlobalFree_(*Dest);то очищаем её
      EndIf
    ;;;=========================
 
  ;http://www.frolov-lib.ru/books/bsp/v13/ch2_3.htm
*Dest=GlobalAlloc_(#GMEM_FIXED,MemoryStringLength(*Source,#PB_Ascii)+1);выделяем память под строку+ байт под завершающий 0
 
 ;;===========================
copystrASCI_Vmemory(*Dest,*Source)
ProcedureReturn *Dest
EndProcedure
 
 
ProcedureCDLL nbInitPlugIn(WinHandle, *PlugInTitle, *PlugInPublisher, *PlugInHint)
 
nbWinHandle = WinHandle
*PlugInTitle=SetStr(*PlugInTitle,?stroka1)
  MessageRequester("1 Процедура nbInitPlugIn :"+"*PlugInTitle", "Указатель : " +Str(*PlugInTitle) +" | Строка в памяти : "+PeekS(*PlugInTitle,-1,#PB_Ascii))
 
*PlugInPublisher=SetStr(*PlugInPublisher,?stroka2)  
 MessageRequester("2 Процедура nbInitPlugIn :"+"*PlugInPublisher", "Указатель : " +Str(*PlugInPublisher) +" | Строка в памяти : "+PeekS(*PlugInPublisher,-1,#PB_Ascii))
 
*PlugInHint=SetStr(*PlugInHint,?stroka3)
 MessageRequester("3 Процедура nbInitPlugIn :"+"*PlugInHint", "Указатель : " +Str(*PlugInHint) +" | Строка в памяти : "+PeekS(*PlugInHint,-1,#PB_Ascii))
 
 FreeStr(*PlugInTitle)
 *PlugInTitle=0
 FreeStr(*PlugInPublisher)
 *PlugInPublisher=0
 FreeStr(*PlugInHint)
 *PlugInPublisher=0
EndProcedure
 
 
;Debug PeekS(?stroka3,-1,#PB_Ascii)
 
 
nbInitPlugIn(WinHandle, PlugInTitle, PlugInPublisher, PlugInHint);тест
 
 
DataSection
  stroka1:
 !db 'TEST variant',0
  stroka2:
 !db 'Home',0
  stroka3:
 !db 'The first trial plug-IN',0
EndDataSection
 



Ещё бы понять зачем адреса пишутся на аргументы nbInitPlugIn()? :roll:


Последний раз редактировалось Сергейчик Пн ноя 06, 2017 2:27 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 04, 2017 3:47 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сергейчик писал(а):
Ещё бы понять зачем адреса пишутся на аргументы nbInitPlugIn()? :roll:

Добрый час. Попробовал ваши примеры кроме последнего, да проблема решена но, описания плагина в NB все равно нет, только регистрация иконки как и раньше, насколько я понял описание плагина находится в дата секции, но это процедура SetStr() не только для описания плагина но и для обработки строк(насколько я понял), ниже пример на делфи, там пример простенького плагина, вывод заголовка окна и сообщения в нем. Там в эту процедуру SetStr() то-же есть обращение, с тем текстом который мы вводим для вывода в окне сообщения. Могу сделать скрин если нужно. По поводу этой функции nbInitPlugIn(), думаю что в ней регистрируются действия этого плагина(я исходник делфи перевёл промтом, посмотрите).
Исходник на Делфи
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
 
LIBRARY TestPlugIn;
 
uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  MBox in "MBox.pas" {MBoxForm};
 
{$E nbp}
 
{$R TESTPLUG.RES}
 
{*}CONST { Типы Параметра Команды действия... }
{*}      ACTIONPARAM_NONE     = 0;
{*}      ACTIONPARAM_ALPHA    = 1;  { May contain alpha, numeric, punctuation, etc. }
{*}      ACTIONPARAM_ALPHASP  = 2;  { Contains aplha text that can be spell checked. }
{*}      ACTIONPARAM_NUMERIC  = 3;  { Must be numeric value 0..9 }
{*}      ACTIONPARAM_MIXED    = 4;  { May be either numeric or alpha. May contain math expression }
{*}      ACTIONPARAM_FILENAME = 5;  { Parameter is a file name }
{*}      ACTIONPARAM_VARIABLE = 6;  { Parameter is a variable name }
{*}      ACTIONPARAM_DATAFILE = 7;  { Parameter is data file - if not a variable then should be localized }
{*}      ACTIONPARAM_OBJNAME  = 8;  { Parameter is an object name }
{*}      ACTIONPARAM_MENUID   = 9;  { Parameter is a mennu item id }
{*}      ACTIONPARAM_FILENOEX = 10; { Parameter is a file name that will not be extracted }
{*}
{*}      MaxActionParams      = 10; { Maximum number of parameters per action }
{*}
{*}TYPE TAddActionProc = PROCEDURE( IDNum      : INTEGER;
{*}                                 Name, Hint : PChar;
{*}                                 Params     : ARRAY OF BYTE;
{*}                                 NumParams  : BYTE );
{*}     TAddFileProc    = PROCEDURE( FileName : PChar; AddFlag : BOOLEAN );
{*}     TVarGetProc     = PROCEDURE( VarName : PChar; VAR Value : PChar );
{*}     TVarSetProc     = PROCEDURE( VarName, Value : PChar );
{*}     TPlayActionProc = PROCEDURE( Action : PChar );
{*}     TInterfaceProc  = FUNCTION( InterfaceID : INTEGER; VAR Data : PChar ) : BOOLEAN;
{*}
{*}VAR nbGetVar     : TVarGetProc;
{*}    nbSetVar     : TVarSetProc;
{*}    nbPlayAction : TPlayActionProc;
{*}    nbInterface  : TInterfaceProc;
{*}    nbAddFile    : TAddFileProc;
{*}    nbAddAction  : TAddActionProc;
{*}    nbWinHandle  : HWND;
 
{*  Используемый, чтобы освободить память, выделенную PChars. Следует использовать это, если Вы создаете кого-либо
{* PChars, чтобы передаться между NeoBook и Вашим Сменным DLL. Отказ использовать это
{* процедура может привести к ошибкам выделения памяти, утечкам памяти, катастрофическим отказам, и т.д...}
{*}PROCEDURE FreeStr( VAR S : PChar );
{*}BEGIN
      {ShowMessage("FreeStr = "+(s)); }
{*}  IF S <> nil THEN GlobalFree( HGLOBAL( S ) );
{*}  S := nil;
{*}END;
 
{*  Используемый, чтобы изменить PChar parameteres. Следует использовать это, если Вы изменяете кого-либо
{* PChars, отправленный между NeoBook и Вашим Сменным DLL. Отказ использовать это
{* процедура может привести к ошибкам выделения памяти, катастрофическим отказам, и т.д...}
{*}PROCEDURE SetStr( VAR Dest : PChar; CONST Source : STRING ); {на сколько я понемаю здесь происходит обработка строк(регистрации плагина и т.д) }
{*}BEGIN
    ShowMessage("StrCopy Dest : "+(Dest));
{*}  IF Dest <> nil THEN GlobalFree( HGLOBAL( Dest ) );
{*}  Dest := Pointer( GlobalAlloc( GMEM_FIXED, Length( Source )+1 ) );
{*}  StrCopy( Dest, PChar( Source ) );
    ShowMessage("StrCopy : "+(Source));
{*}END;
{******************** Конец Функций интерфейса NeoBook **********************}
 
 
{******************* Ваши Пользовательские Сменные Функции Идут Сюда ********************}
FUNCTION EditMyMessageBox( VAR aTitle, aMessage : PChar ) : BOOLEAN; {здесь вызывается форма окна для редактирования, заголовка окна и сообщения}
BEGIN
 
  Result := FALSE;
  MBoxForm := TMBoxForm.Create( Application );
  WITH MBoxForm DO
    TRY
      Edit1.Text := aTitle;
      Edit2.Text := aMessage;
      IF ShowModal = mrok THEN
        BEGIN
          SetStr( aTitle, Edit1.Text );  {заголовок окна сообщения}
          SetStr( aMessage, Edit2.Text );{само сообщение}
          Result := TRUE;
        END;
    FINALLY
      Free;
    END;
END;
{nbEditAction - вызванный NeoBook, чтобы редактировать/определить на команд Плагина.
  Плагин может вывести на экран диалоговое окно с полями для пользователя, чтобы заполнить. Возвратиться
  ИСТИНА в случае успеха, ЛОЖЬ, если нет..}
FUNCTION nbEditAction( IDNum      : INTEGER;
                       VAR Params : ARRAY OF PChar ) : BOOLEAN;
BEGIN
  CASE IDNum OF
 {Исследуют строку Действия, чтобы определить который команда Plug-In выполниться...}
    1 : Result := EditMyMessageBox( Params[0], Params[1] ); {небок сюда присылает строки, ранее нами редактированые (заголовка окна и сообщения)}
  END;
END;
 
 
FUNCTION DisplayMyMessageBox( aTitle, aMessage : PChar ) : BOOLEAN;
BEGIN
  MessageBox( nbWinHandle, aMessage, aTitle, MB_OK + MB_ICONINFORMATION );
  Result := TRUE;
END;
 
{nbExecAction - вызванный NeoBook, чтобы выполнить одну из команд Плагина...}
FUNCTION nbExecAction( IDNum     : INTEGER;
                       VAR Params : ARRAY OF PChar ) : BOOLEAN;
BEGIN
  CASE IDNum OF
{Исследуют строку Действия, чтобы определить который команда Plug-In выполниться...}  
    1 : Result := DisplayMyMessageBox( Params[0], Params[1] ); {команда на показ окна с сообщением}
  END;
END;
 
{nbMessage - отправленный NeoBook, чтобы сообщить плагину о важных действиях NeoBook...}
PROCEDURE nbMessage( MsgCode, Reserved : INTEGER );
BEGIN
  {Не все типы плагинов будут заботиться об этих сообщениях,
    таким образом, они могут быть проигнорированы если не необходимый. Эта процедура должна присутствовать даже если
    ни одно из сообщений не используется.
 
    Возможные значения MsgCode:
 
      1  = Pub has entered run mode
      2  = Pub is about to exit run mode and return to design mode.
      3  = Pub window has been deactivated
      4  = Pub window has been activated
      5  = Pub window has been moved or sized
      6  = Pub is about to display another page
      7  = Pub window has been minimized
      8  = Pub window has been restored
      9  = A pub was opened (design mode only)
      10 = A pub was saved (design mode only)
 
    Reserved value is not currently used
  }
 
  CASE MsgCode OF
    1  : ; { Don&#39;t care }
    2  : ; { Don&#39;t care }
    3  : ; { Don&#39;t care }
    4  : ; { Don&#39;t care }
    5  : ; { Don&#39;t care }
    6  : ; { Don&#39;t care }
    7  : ; { Don&#39;t care }
    8  : ; { Don&#39;t care }
    9  : ; { Don&#39;t care }
    10 : ; { Don&#39;t care }
  END;
 
END;
 
{nbInitPlugIn - вызванный NeoBook, чтобы запросить информацию о Плагине...}
PROCEDURE nbInitPlugIn( WinHandle : HWND; VAR PlugInTitle, PlugInPublisher, PlugInHint : PChar );
BEGIN
{Сохраняют дескриптор Родителя, Приложение NeoBook или скомпилированный паб Окно - могут требоваться некоторыми функциями Windows}    
  nbWinHandle := WinHandle;
  {ShowMessage("nbWinHandle :"+IntToStr(nbWinHandle)); }
 
{Заголовок этого Плагина (появляется как возглавляющий в списке действия NeoBook),}
  SetStr( PlugInTitle, "Демонстрационный Плагин" );
  ShowMessage("PlugInTitle : "+(PlugInTitle));
 
{Издатель этого Плагина}
  SetStr( PlugInPublisher, "The author" );
  ShowMessage("PlugInPublisher : "+(PlugInPublisher));
 
{Описание этого Плагина}
  SetStr( PlugInHint, "Это плагин создан, чтобы показать окно сообщения в Windows" );
  ShowMessage("PlugInHint : "+(PlugInHint));
 
END;
 
 
{nbRegisterScriptProcessor - вызванный NeoBook, регистрируя Ваш плагин
  Обеспечивает доступ к Проигрывателю Сценария Действия NeoBook через nbPlayAction...}
PROCEDURE nbRegisterScriptProcessor( PlayActionProc : POINTER );
BEGIN
  {*************************************************************}
  {*} nbPlayAction := @TPlayActionProc( PlayActionProc );
  {****************************************************************************}
END;
 
{nbRegisterInterfaceAccess - вызванный NeoBook, регистрируя Ваш плагин
  Обеспечивает доступ к части интерфейса времени проектирования NeoBook через nbInterface...}
PROCEDURE nbRegisterInterfaceAccess( InterfaceProc : POINTER );
BEGIN
  {*************************************************************}
  {*} nbInterface := @TInterfaceProc( InterfaceProc );
  {****************************************************************************}
END;
 
{nbRegisterPlugIn - вызванный NeoBook, когда это хочет, чтобы Вы зарегистрировали действия своего плагина...}
PROCEDURE nbRegisterPlugIn( AddActionProc, AddFileProc, VarGetFunc, VarSetFunc : POINTER );
BEGIN
 
  {*************************************************************}
  {*} nbGetVar    := @TVarGetProc( VarGetFunc );
  {*} nbSetVar    := @TVarSetProc( VarSetFunc );
  {*} nbAddAction := @TAddActionProc( AddActionProc );
  {*} nbAddFile   := @TAddFileProc( AddFileProc );
  {****************************************************************************}
  { Вызовите процедуру AddAction для каждой команды Plug-In.
 
   Параметры для ndAddAction процедуры:
 
    Item 1 = Идентификационный номер действия - должен использовать уникальный идентификатор для каждого из Ваших действий.
    Item 2 = Имя действия
    Item 3 = Описание действия
    Item 4 = Массив, описывающий каждый из параметров Действия - выбирает из следующего:
 
      ACTIONPARAM_NONE     = Используйте, если действие не содержит параметров.
      ACTIONPARAM_ALPHA    = Параметр является строкой. Может содержать альфу, числовую, пунктуация, и т.д.
      ACTIONPARAM_ALPHASP  = Параметр является строкой, которая может быть проверена орфографию.
      ACTIONPARAM_NUMERIC  = Параметр является числом.
      ACTIONPARAM_MIXED    = Может быть или числовым или альфа. Может содержать математическое выражение.
      ACTIONPARAM_FILENAME = Параметр является именем файла.
      ACTIONPARAM_VARIABLE = Параметр является именем переменной.
      ACTIONPARAM_DATAFILE = Параметр является файлом данных - если не переменная тогда должна быть локализована.
      ACTIONPARAM_OBJNAME  = Параметр является именем объекта
      ACTIONPARAM_MENUID   = Параметр является mennu идентификатором элемента
      ACTIONPARAM_FILENOEX = Параметр является именем файла. Поскольку с файлами, которые Вы не хотите
                             NeoBook, чтобы извлечь автоматически. Так как файлы не будут
                             извлеченный, Вы должны будете использовать ndFileToStream.
 
    Item 5 = Число параметров требуется этим действием
  }
 
  {******************* Начните действия своего Плагина ниже *********************}
 
  {Затем, в случае необходимости, скажите NeoBook, какие дополнительные файлы требуются для Вашего плагина.
    Они - файлы, которые NeoBook соберет, компилируя публикации это
    используйте этот плагин. Если Ваш плагин использует какие-либо файлы данных, драйверы или специальные DLL
    это - то, где Вы скажете NeoBook об этом. Не необходимо включать
    имя плагина непосредственно начиная с NeoBook автоматически примет это
    это требуется.
 
    Параметры для ndAddFile процедуры:
 
    Item 1 = Имя файла включая корректный диск и путь
    Item 2 = ИСТИНА, чтобы добавить файл, ЛОЖЬ, чтобы удалить файл
 
    Например:
 
    nbAddFile( "c:\path\somefile.xyz", TRUE );
  }
 
   nbAddAction( 1,"pMessageBox", "Показать Сообщение.",
  [ACTIONPARAM_ALPHA,ACTIONPARAM_ALPHA], 2 ); {это параметры и описание функции этого плагина}
 
END;
 
 
PROCEDURE DLLHandler( Reason : INTEGER ); {это не понемаю для чего}
BEGIN
   
  IF Reason = DLL_PROCESS_DETACH THEN
    BEGIN
      {Если этот плагин требует какой-либо специальной обработки прежде, чем быть разгруженным в
        память, сделайте это здесь. Оставьте незаполненный, если никакая специальная обработка не необходима.}
    END;
END;
 
 
{***** Экспорт необходимые функции для интерфейса NeoBook. *****}
{*}EXPORTS nbEditAction;
{*}EXPORTS nbExecAction;
{*}EXPORTS nbInitPlugIn;
{*}EXPORTS nbRegisterPlugIn;
{*}EXPORTS nbRegisterScriptProcessor;
{*}EXPORTS nbRegisterInterfaceAccess;
{*}EXPORTS DisplayMyMessageBox;
{******************************************************************************}
 
BEGIN
 
  DLLProc := @DLLHandler;
 
END.
 
 
 


Попробовал последний ваш пример, результат тот-же.
Пробовал исходник который выше в делфи, закоментировал строки все в процедуре nbRegisterPlugIn(), установил плагин. Автор,описание,иконка и название плагина зарегистрировались. Потом начал по очереди разкоментировать строки в процедуре, и выяснил что важная строка вот эта nbAddAction := @TAddActionProc( AddActionProc );, когда она закоментирована NB говорит "невозможно установить плагин" но "описание,иконка,название" плагина устанавливаются, если раскоментировать эту строку и независимо закоментированы остальные три, то плагин работает-устанавливается без проблем.
Получается что независимо от этой nbRegisterPlugIn() процедуры, описание так или иначе должно присутствовать, после регистрации плагина в NB.
Надеюсь вам это поможет, а вы поможете мне.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс ноя 05, 2017 1:41 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
Вот так *Value.s быть не должно,так как тип должен быть один
Код:
1
2
3
 
Prototype GetVarProcType(VarName.s, *Value.s)
 


Вы попробуйте эту функцию nbRegisterPlugIn() из dll что Пётр вам ранее давал

и скомпильте dllна эти функции из делфи и сюда залейти


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс ноя 05, 2017 11:22 am 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сергейчик писал(а):
Вот так *Value.s быть не должно,так как тип должен быть один
Код:
1
2
3
 
Prototype GetVarProcType(VarName.s, *Value.s)
 


Вы попробуйте эту функцию nbRegisterPlugIn() из dll что Пётр вам ранее давал

и скомпильте dllна эти функции из делфи и сюда залейти

Добрый час.
Всё работает, перевёл в строку, всё что было PСhar, устанавливается нормально и работает. Я думаю что в данном примере, нужно сначала что-бы описание установилось в NB, а потом уже разобраться с nbRegisterPlugIn(), так как без тех строк в этой процедуре nbRegisterPlugIn() на делфи, плагин устанавливается, просто в нем отсутствуют действия.
Вот значение. string
{*}TYPE TAddActionProc = PROCEDURE( IDNum : INTEGER;
{*} Name, Hint : string;
{*} Params : ARRAY OF BYTE;
{*} NumParams : BYTE );
{*} TAddFileProc = PROCEDURE( FileName : string; AddFlag : BOOLEAN );
{*} TVarGetProc = PROCEDURE( VarName : string; VAR Value : string );
{*} TVarSetProc = PROCEDURE( VarName, Value : string );
{*} TPlayActionProc = PROCEDURE( Action : string );
{*} TInterfaceProc = FUNCTION( InterfaceID : INTEGER; VAR Data : string ) : BOOLEAN;
{*}
{*}VAR nbGetVar : TVarGetProc;
{*} nbSetVar : TVarSetProc;
{*} nbPlayAction : TPlayActionProc;
{*} nbInterface : TInterfaceProc;
{*} nbAddFile : TAddFileProc;
{*} nbAddAction : TAddActionProc;
{*} nbWinHandle : HWND;

Вот оригинал. PChar
{*}TYPE TAddActionProc = PROCEDURE( IDNum : INTEGER;
{*} Name, Hint : PChar;
{*} Params : ARRAY OF BYTE;
{*} NumParams : BYTE );
{*} TAddFileProc = PROCEDURE( FileName : PChar; AddFlag : BOOLEAN );
{*} TVarGetProc = PROCEDURE( VarName : PChar; VAR Value : PChar );
{*} TVarSetProc = PROCEDURE( VarName, Value : PChar );
{*} TPlayActionProc = PROCEDURE( Action : PChar );
{*} TInterfaceProc = FUNCTION( InterfaceID : INTEGER; VAR Data : PChar ) : BOOLEAN;
{*}
{*}VAR nbGetVar : TVarGetProc;
{*} nbSetVar : TVarSetProc;
{*} nbPlayAction : TPlayActionProc;
{*} nbInterface : TInterfaceProc;
{*} nbAddFile : TAddFileProc;
{*} nbAddAction : TAddActionProc;
{*} nbWinHandle : HWND;

Попробуйте установить их по очереди, самый последний(TestPlugIn.rar) в конце установки напишет что невозможно установить плагин, но после закрытия этого сообщения и пройдя в пункт в NB "установка плагина" он будет виден и к нему будет описание.


Вложения:
Комментарий к файлу: Это плагин без строк в процедуре nbRegisterPlugIn(). То есть пустая процедура.
TestPlugIn.rar [163.68 KiB]
Скачиваний: 4
Комментарий к файлу: Скомпилил 2 файла, в оригинале и в строке.
PlugIn Delphi.rar [327.4 KiB]
Скачиваний: 5
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 13, 2017 2:57 pm 
Не в сети
ассистент

Зарегистрирован: Пт окт 13, 2017 12:42 pm
Сообщений: 23
Благодарил (а): 10 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Мужики, неужели здесь нет знающих людей которые смогли-бы портировать рабочий исходник плагина на пурик ?. :?:
Я же не прощу создать код искусственного интеллекта, тем более есть примеры на разных языках, вы ведь тоже когда-то просили о помощи(программистами не рождаются), наверно это забылось.
Возможно денег хотите за рабочий исходник ?, так чего тогда молчим ?.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт ноя 14, 2017 1:20 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
kolya писал(а):
Мужики, неужели здесь нет знающих людей которые смогли-бы портировать рабочий исходник плагина на пурик ?. :?:
Я же не прощу создать код искусственного интеллекта, тем более есть примеры на разных языках, вы ведь тоже когда-то просили о помощи(программистами не рождаются), наверно это забылось.
Возможно денег хотите за рабочий исходник ?, так чего тогда молчим ?.

Так что предлагаете выучить neoobuk и делфи что бы понять что там и для чего предназначено? :roll:
На пурике возврат ссылки на пмаять можно сделать с типом интегер а не *mem.
Так говорю скомпиль попробуй функции на делфи в либу и из неё использовать их?


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

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


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

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


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

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