purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 4:04 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Пн май 11, 2020 11:35 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик
Цитата:
Так в моей структуре nSaveSettings.i(вот и 4байта?)это вобще может указатель адреса а x86 он 4байта. :roll:
я так понял акелпад на ричедит основан?

Он у всех 4 байта (в исходнике, и предложенных вариантах), integer, а когда смотрел разницу между захваченным правильно и и правильным дескриптором, то ничего не остаётся как nSaveSettings сделать 8 байт, указатели же ты не можешь увеличить в байтах.
2. Вроде RichEdit, но функциями RichEdit я не смог с ним работать, несмотря на то что я имею дескриптор и мне не важно. Если бы был 100% RichEdit, то не падал бы при работе функциями RichEdit, я ведь с объектом RichEdit в AutoIt3 работаю без проблем. А если работаю функциями обычного Edit то не падает, ну или из RichEdit но совместимые с Edit.

Обновил, теперь ссылка на архив в первом посте всегда. Теперь работает нативным методом используя дескриптор из структур.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Пн май 11, 2020 12:25 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AZJIO писал(а):
Он у всех 4 байта
В x64 указатель равен 8 байтам. К дескрипторам это тоже относится.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Пн май 11, 2020 1:34 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Пётр
А вот BOOL наверно лучше в ".b", хоть они одинаковы по смыслу с ".a", но ".b" как то само звучит как BOOL, и в любом случае хоть от 0 до 255, хоть -127 до 127 в любом случае False только при двоичном "0000000", в остальных случаях True, а "0" в любом из этих типов одинаков.

Попробовал функцию и структуру поиска и замены, сработало, обновил архивчик.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Пн май 11, 2020 1:54 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
В примере выложил который и увидел флаг с едит.h для константы проца x64 поэтому там и compiler применил .
а на какой операционке AZJIO запускаешь? :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Пн май 11, 2020 4:04 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик писал(а):
В примере выложил который и увидел флаг с едит.h для константы проца x64 поэтому там и compiler применил .
а на какой операционке AZJIO запускаешь? :roll:

Win10x64, компилирую в x86. Флаг EM_EXGETSEL64 иного нет, AkelPad работает и на старых компах, а без 64 - EM_EXGETSEL закомментирован в header, видимо там подразумевается RichEdit старой версии 3.0.

Флаги dwFindFlags и dwReplaceFlags в структуре TEXTREPLACEW сделал ".i" вместо ".l", теперь на x64 тоже работают. В виду того что DWORD пришлось делать как Integer, то встаёт вопрос о dwSupport в структуре PLUGINDATA, там при смене на ".i" поля не сдвинулись, хоть и размер поля увеличился.

Ещё проблема, флаги wLangSystem и wLangModule в x64 возвратили 1049, что соответствует русскому языку. В общем многими экспериментами, в том числе сделал функцию чтения структуры по 2 байта сделал вывод что поля bOnStart начинающиеся на "b" должны быть ".l", тогда у меня вроде все элементы структуры сошлись и даже пару строковых, которые были в юникоде а читались как анси, потому что из-за сдвига там был анси.

перезалил архивчик

при поиске и замене почему то в x64 не возвращает число замен.


Последний раз редактировалось AZJIO Вт май 12, 2020 5:10 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Вт май 12, 2020 4:44 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Может проблема из за того что компилишь в x86 а используешь в x64? нельзя наверное так,есле только для x86 полноценно и использовать на x64?,типа скомпилятся процедуры с адресацией x86 и будет всё равно неполноценно работать под x64 .:roll:
Ps:Байты смотреть с права на лево по типам(перевёрнуты в памяти)
Код:
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
 
Structure _STORAGE_ADAPTER_DESCRIPTOR
Version.l;
Size.l;
MaximumTransferLength.l;
MaximumPhysicalPages.l;
AlignmentMask.l;
AdapterUsesPio.b;
AdapterScansDown.b;
CommandQueueing.b;
AcceleratedTransfer.b;
;;#if (NTDDI_VERSION < NTDDI_WINXP)
   ; BOOLEAN BusType;
;#else
  BusType.b;
;;#endif
BusMajorVersion.w;
BusMinorVersion.w;
EndStructure
 
 
 
Global r._STORAGE_ADAPTER_DESCRIPTOR
 
r\BusMajorVersion=777
r\BusMinorVersion=-1
ShowMemoryViewer(@r,SizeOf(_STORAGE_ADAPTER_DESCRIPTOR))
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Вт май 12, 2020 5:46 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик
Цитата:
ShowMemoryViewer

Скомпилировал, не работает, посмотрел в описание, там CallDebugger, что говорит о том что программа работает только в отладчике, а в скомпилированной все Debug будут удалены. А я не могу проверить в режиме отладки, потому что это плагин, его надо компилировать, чтобы встроить в прогу. Возможно надо взять тот что в %Temp%, который компилируется тестовый.

Цитата:
Может проблема из за того что компилишь в x86 а используешь в x64?

2. Проверил сейчас, что использование плага x86 в AkelPad x64 и наоборот просто не грузит плаг в список для использования и я этого ожидал. А в Win10x64 работает AkelPad x86 и x64. Так что с битностью ни как не пролетишь. И конечно у меня открыты обе папки x86 и x64, оба ярлыка AkelPad на рабочем столе, запущены оба IDE PureBasic, и даже на этапе теста я делал исходники x64, чтобы после экспериментов пробовать изменения в исходниках x86 и когда оно работало в обоих я просто переходил на один исходник и в случае теста исходника x64 копировал из x86 и вносил изменения, например nChanges в структуре TEXTREPLACEW делал .u .l .q (2, 4, 8 ) и ничего не помогает возвратить количество замен.
А также перезапускать AkelPad не требуется при замене плага, он использует каждый раз загружая его заново. Единственное, что перезапускать с x86 на x64, хотя и это можно устранить разрешив запуск несколько копий AkelPad.

3. Для лёгкого теста скачай мою сборку, в меню "Плагины -> Плагины..." откроется список команд, в которых мой плаг будет первым и все функции плага будут первыми в списке (потому что "1" в начале имени). Двойной клик на имени функции вызывает её. Чтобы не мучится при частом вызове одной и той же команды, поправив всего тип переменной в исходнике, нужно сделать кнопку вызова функции на панель инструментов. Для этого правой кнопкой мыши кликни на любой кнопке рядом с которой хочешь добавить тестовую кнопку, откроется список кнопок, в этот список вклинь строку
Цитата:
"Тест" Call("1test::Test_PLUGINDATA") Icon("%a\AkelFiles\icons\ToolbarEx.dll", 18)

можешь добавлять кнопку на каждую функцию, заменяя в строке текст "Test_PLUGINDATA" это собственно имя вызываемой функции. И сможешь сам проверить как это работает, любое изменение.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Вт май 12, 2020 6:24 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Попробую может на досуге а процедуру просмотра hex после работы может напишу.или найду свой исходнк. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Вт май 12, 2020 7:30 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик писал(а):
Попробую может на досуге а процедуру просмотра hex после работы может напишу.или найду свой исходнк. :roll:

Я вместо варианта со сдвигом сделал чтение структуры с шагом 4 байта, как в основном вся структура по 4 байта, при этом у меня убралась проблема, что байты задом-наперёд.
Код:
1
2
3
4
5
res + #CRLF$ + #CRLF$
For i=0 To 172 Step 4
        res + Hex(PeekL(*pd + i), #PB_Long) + ", "
Next
MessageRequester("Структура tr.PLUGINDATA", res)



Может #PB_Structure_AlignC и не обязателен, если структура изначальна кратна 4 байтам? Я почитал как выравнивается структура и в случае с выше указанными структурами выравнивать нечего.

Обновил:
Добавил вызов из плагина другого плагина, как пример "Coder::Settings".
Добавил подсветку текста "шрифт" (можно сделать GUI для параметров), т.е. пример вызова с параметрами.

Попытка GUI ничего не дала
GUI
Код:
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
 
#Window_0 = 0
Procedure Events()
        ; Protected
        Select Event()
                Case #PB_Event_Gadget
                        Select EventGadget()
 
                                Case 1
                                        UnbindEvent(#PB_Event_Gadget, @Events(), #Window_0)
                                        UnbindEvent(#PB_Event_CloseWindow, @Events(), #Window_0)
                                        CloseWindow(#Window_0)
 
                        EndSelect
                Case #PB_Event_CloseWindow
                        ; перед закрытием отсоединяем события
                        UnbindEvent(#PB_Event_Gadget, @Events(), #Window_0)
                        UnbindEvent(#PB_Event_CloseWindow, @Events(), #Window_0)
                        CloseWindow(#Window_0)
        EndSelect
EndProcedure
 
; Внешняя функция плагина
; Пример вызова диалога "Открыть файл"
ProcedureCDLL Test_GUI(*pd.PLUGINDATA)
        ; Функция не поддерживает автозагрузку
;       *pd\dwSupport | #PDS_NOAUTOLOAD
;       If *pd\dwSupport & #PDS_GETSUPPORT
;               ProcedureReturn
;       EndIf
 
        If OpenWindow(#Window_0, 0, 0, 620, 400, "Пример...", #PB_Window_Tool | #PB_Window_SystemMenu | #PB_Window_WindowCentered, *pd\hMainWnd)
                ButtonGadget (1, 10, 60, 200, 30, "Закрыть")
 
                BindEvent(#PB_Event_Gadget, @Events(), #Window_0)
                BindEvent(#PB_Event_CloseWindow, @Events(), #Window_0)
               
;               SetWindowState(#Window_0, #PB_Window_Normal)
;               SetActiveWindow(#Window_0)
;               Delay(2000)
        EndIf
 
        ProcedureReturn #UD_NONUNLOAD_ACTIVE ; Не выгружать плагин и установить активный статус
EndProcedure
 



Эти события работают, но только они срабатывают и при создании списка функций, когда AkelPad временно открывает DLL чтобы экспортировать функции. Взято из плага Notepad++, примера для PureBasic.
Код:
1
2
3
4
5
6
7
8
9
10
11
; Эти события происходят в том числе, когда создаётся список "плагов:функций"
 
; Событие когда AkelPad загружает этот плагин
ProcedureDLL AttachProcess(Instance)
        MessageRequester("Загрузил плаг", "дескриптор плага : " + Str(Instance))
EndProcedure
 
; Событие когда AkelPad выгружает этот плагин
ProcedureDLL DetachProcess(Instance)
        MessageRequester("Выгрузил плаг", "дескриптор плага : " + Str(Instance))
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 14, 2020 12:37 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Вот процедуру hex на x86 дописал сегодня. :roll:
http://purebasic.info/phpBB3ex/viewtopic.php?f=19&t=5549&p=94555#p94555


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 14, 2020 8:29 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Обновил архив, сделал GUI, добился, чтобы он был независимым нормально закрывался/выгружался не блокируя потом программу. И в некоторые функции добавил InputRequester, чтобы задать настройки замены/подсветки.

Пётр
Посмотрел в описании BindEvent, там есть WaitWindowEvent(), хотя у меня в вызываемой функции @Events() есть событие #PB_Event_CloseWindow. И вроде как ожидание события WaitWindowEvent() не нужно, но заменив его на Delay(10) плаг виснет, не прорисовывая кнопки окна (как будто )WaitWindowEvent() предотвращает закрытие окна). И также мне пришлось добавить флаг fGui о том, что окно работает и запущен цикл Repeat, без которого окно сразу закрывается. В общем то что работало в Notepad++ не работает в AkelPad в чистом виде, пришлось переделать. Может это костыль, может можно по иному сделать?

решено
И ещё при вызове GUI_Highlight() я не могу получить структуру, потому что не знаю как её указать. В DLL она видимо передаётся нативно. Я попробовал во время приатачивания всунуть её в глобальную переменную, точнее нужный мне параметр - дескриптор окна, но в какой то момент у меня DLL даже не выгружалась, я закрываю AkelPad и не могу удалить файл DLL, потому что он занят системой и я всё возвращал назад, не знаю что повлияло. В общем как дескриптор сохранить в глобальную или получить структуру в глобальную переменную?


Ещё обновил, сохранил указатель на структуру, появился доступ к структуре из внутренних функций.


Последний раз редактировалось AZJIO Чт май 14, 2020 11:50 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 14, 2020 11:43 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AZJIO писал(а):
Посмотрел в описании BindEvent, там есть WaitWindowEvent(), хотя у меня в вызываемой функции @Events() есть событие #PB_Event_CloseWindow. И вроде как ожидание события WaitWindowEvent() не нужно, но заменив его на Delay(10) плаг виснет
Потому что обработка событий нужна. Не обязательно в плагине. Подойдет обработчик событий AkelPad.

AZJIO писал(а):
без которого окно сразу закрывается
Может AkelPad выгружает?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 14, 2020 11:57 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Пётр писал(а):
Может AkelPad выгружает?
Я, как мне сказали, вставил константу
Код:
1
ProcedureReturn #UD_NONUNLOAD_ACTIVE ; Не выгружать плагин и установить активный статус

Но не помогает. Иначе я не мог бы удалить файл, пока он загружен.
Я обновил, все функции переделал на кнопки в GUI, экспортируется только одна - GUI.

И во время показа GUI не работает вызов смены подсветки например с HTML на XML, так как это плаг Coder, то наверно блокируются события плагов. Проверил, блокируются все вызовы "Настроить" из плагов, а команды "Поиск, Новый, Открыть" в основном окне не блокируется. В тоже время окно "Настройки" плагов блокирует окно AkelPad.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 14, 2020 1:02 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AZJIO писал(а):
Я, как мне сказали, вставил константу
Это не помогает.
Вставь этот код в плагин.
Код:
1
2
3
4
5
6
7
ProcedureDLL AttachProcess(Instance)
  MessageRequester("", "Плагин загружен")
EndProcedure
 
ProcedureDLL DetachProcess(Instance)
  MessageRequester("", "Плагин выгружен")
EndProcedure

Вероятно функция GUI плагина должна выполнятся все время пока отображается окно. Нужно смотреть в документации ее описание.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 14, 2020 6:11 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Пётр писал(а):
AZJIO писал(а):
Я, как мне сказали, вставил константу
Это не помогает.
Вставь этот код в плагин.
Код:
1
2
3
4
5
6
7
ProcedureDLL AttachProcess(Instance)
  MessageRequester("", "Плагин загружен")
EndProcedure
 
ProcedureDLL DetachProcess(Instance)
  MessageRequester("", "Плагин выгружен")
EndProcedure

Вероятно функция GUI плагина должна выполнятся все время пока отображается окно. Нужно смотреть в документации ее описание.

Так что на каждое окно своя функция плагина или прыжок с калбака на общуюля всех? :roll:


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

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


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

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


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

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