purebasic.info

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

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




Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Чт май 21, 2020 9:37 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Сергейчик писал(а):
Вывод это не выровненная структура си+непонятки с первым типом.
Напиши об этом разработчикам Си (Ритчи, Страуструп и др.) и укажи что у их языка неправильное выравнивание полей структуры. :D :D
Пусть исправят стандарт и переделают все компиляторы и пересоберут все сишные проги. :D :D

Сергейчик писал(а):
Мы же в пурике добавляем на структуру директиву выравнивания align.
В Си структура ровняется по умолчанию. https://habr.com/ru/post/142662/
При необходимости можно выключить примерно так (зависит от компилятора).
Код:
1
2
3
4
5
6
7
typedef struct
{
    uint8_t a;
    uint8_t b;
    uint8_t c;
    uint8_t d;
} __attribute__((packed)) aa;


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


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Пётр
Я запустил код без выравнивания, он выдал
12
0
1
3
7
8
Из этого вывод, PureBasic структуры вообще не выравнивает?

Сергейчик
Посмотри размеры типов, как я ранее говорил по информации на хабре, выравнивание "-1" означает что следующее поле выравнивается так, что перед ним кратное этому размеру поля. Попробуй разделить начала поля на ширину поля и у тебя будет всегда целое число.

Цитата:
b.w=2;нет выравнивания
как нет, сдвиг 2, размер поля 2, т.е. 2/2=1 кратно.

Цитата:
я даже незнаю как это интерпритировать
OffsetOf адрес поля, в справке всё есть


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
AZJIO писал(а):
Пётр
Я запустил код без выравнивания, он выдал
12
0
1
3
7
8
Из этого вывод, PureBasic структуры вообще не выравнивает?

Сергейчик
Посмотри размеры типов, как я ранее говорил по информации на хабре, выравнивание "-1" означает что следующее поле выравнивается так, что перед ним кратное этому размеру поля. Попробуй разделить начала поля на ширину поля и у тебя будет всегда целое число.

Цитата:
b.w=2;нет выравнивания
как нет, сдвиг 2, размер поля 2, т.е. 2/2=1 кратно.

Цитата:
я даже незнаю как это интерпритировать
OffsetOf адрес поля, в справке всё есть

Я вам давал скриншот книги на align тобишь выравнивание но вы видимо не смотрели.вот вам ещё дам ссылку
https://it.wikireading.ru/34858
Вопервых попросите скомпилить наш пример автора akrlpada(если конечно есть возможность,также узнайте язык программирования и его версию),мне лично лень устанавливать си делать пример и дебаггить результат его компиляции. :roll:


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AZJIO писал(а):
Из этого вывод, PureBasic структуры вообще не выравнивает?
По умолчанию (без Align) нет.

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


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Ещё плаг ConvKey (яндекс, upload.ee) - Преобразовывает текст из "привет" в "ghbdtn" и наоборот.
А в Linux скрипты не работают без сложных телодвижений, а плаг будет/должен работать из коробки.


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Как преобразовать функцию в PureBasic?
GetExtCallParam
Код:
1
2
3
4
5
6
INT_PTR GetExtCallParam(LPARAM lParam, int nIndex)
{
  if (*((INT_PTR *)lParam) >= (INT_PTR)((nIndex + 1) * sizeof(INT_PTR)))
    return *(((INT_PTR *)lParam) + nIndex);
  return 0;
}



Смысл функции как я понимаю получить число параметров
Код:
1
INT_PTR nAction=GetExtCallParam(pd->lParam, 1);



И ещё проверка валидности или существования параметра, первое условие как в предыдущей, только возврат True/False. Видимо тут проверяется что параметр не равен 0, а значит его можно использовать.
IsExtCallParamValid
Код:
1
2
3
4
5
6
BOOL IsExtCallParamValid(LPARAM lParam, int nIndex)
{
  if (*((INT_PTR *)lParam) >= (INT_PTR)((nIndex + 1) * sizeof(INT_PTR)))
    return TRUE;
  return FALSE;
}


вызов
Код:
1
2
if (IsExtCallParamValid(pd->lParam, 2))
  pColorText=(unsigned char *)GetExtCallParam(pd->lParam, 2);



Для информации
при вызове функции внутри кода
Код:
1
SendMessage_(*pd\hMainWnd, #AKD_DLLCALLW, 0, @pcsW)


где pcsW это структура PLUGINCALLSENDW, в которой pcsW\lParam = @dhm, то есть lParam является структурой указателей на параметры, где первое поле структуры является размером самой структуры. Вот для примера:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure GUI_Highlight(*pd.PLUGINDATA)
        Protected pcsW.PLUGINCALLSENDW
        Protected dhm.DLLECHIGHLIGHT_MARK
 
        dhm\dwStructSize = SizeOf(DLLECHIGHLIGHT_MARK)
        dhm\nAction = #DLLA_HIGHLIGHT_MARK
        dhm\pColorText = @"#BFCAA9"
        dhm\pColorBk = @"0" ; #3F3F3F
        dhm\dwMarkFlags = 2
        dhm\dwFontStyle = 0
        dhm\dwMarkID = -1
        dhm\wszMarkText = @"[a-zA-Z]"
 
        pcsW\pFunction = @"Coder::HighLight"
        pcsW\lParam = @dhm
        pcsW\dwSupport = 0
 
        SendMessage_(*pd\hMainWnd, #AKD_DLLCALLW, 0, @pcsW)
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
Procedure GetExtCallParam(*lParam, nIndex)
        If PeekI(*lParam) >= (nIndex + 1) * SizeOf(*lParam) ; если размер структуры больше или равен индексу умноженному на размер указателя структуры
                ProcedureReturn *lParam + nIndex * SizeOf(*lParam) ; возвращает указатель на поле структуры
        EndIf
        ProcedureReturn 0
EndProcedure
 
Procedure IsExtCallParamValid(*lParam, nIndex)
        If PeekI(*lParam) >= (nIndex + 1) * SizeOf(*lParam)
                ProcedureReturn #True
        EndIf
        ProcedureReturn #False
EndProcedure
 
 
; Внутренняя функция
; Пример вызова плагина "1test::test_Arg" с параметрами, например 12 или "привет".
ProcedureCDLL test_Arg(*pd.PLUGINDATA)
        Protected *nAction, nArg
        If *pd\lParam
                *nAction = GetExtCallParam(*pd\lParam, 1)
                nArg = PeekI(*nAction)
               
;               проблема, как узнать по указателю на что ссылается на строку или число
;               как сделать чтобы AkelPad не упал при неверно введённом типе
                If TypeOf(nArg) = #PB_Integer ; указатель nArg всегда Integer
                        MessageRequester("Строка", PeekS(nArg))
                Else
                        MessageRequester("Число", Str(PeekI(nArg)))
                EndIf
        EndIf
EndProcedure



Хотел сделать StructureUnion, но строки с числами не объединяются.

Так не компилируется
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Structure ArgData
    StructureUnion
        num.i
        string.s{20}
    EndStructureUnion
EndStructure
 
ProcedureCDLL test_Arg(*pd.PLUGINDATA)
        Protected *nAction, nArg
        If *pd\lParam
                *nAction = GetExtCallParam(*pd\lParam, 1)
                Protected *Arg.ArgData = PeekI(*nAction)
                MessageRequester("Строка", PeekS(*Arg\string), #PB_Unicode, 20)
                MessageRequester("Число", Str(PeekI(*Arg\num)))
;               так падает
;               MessageRequester("Строка", *Arg\string)
;               MessageRequester("Число", Str(*Arg\num))
        EndIf
EndProcedure



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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Как то так. :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
 
Structure LPARAM2;тестовая
  lParam.i
EndStructure
Global test.LPARAM2
test\lParam=4;если меньше 4 то возврат 0
;=============
 
Structure LPARAM
  lParam.i
EndStructure
Procedure.i GetExtCallParam(*lParam.LPARAM ,nIndex)
 
  If *lParam\lParam >= (nIndex + 1) * 4
    ProcedureReturn *lParam\lParam  + nIndex;
   EndIf
    ProcedureReturn 0
EndProcedure
 
 Debug  @test\lParam;adres peremennoi
 Debug GetExtCallParam(@test\lParam, 0)
 
 
 
 ;наверно должно быть так по структуре PLUGINDATA
 Procedure GetExtCallParam(*pd.PLUGINDATA ,nIndex)
  If *pd\lParam >= (nIndex + 1) * 4
    ProcedureReturn *pd\lParam  + nIndex;
   EndIf
    ProcedureReturn 0
 EndProcedure
  GetExtCallParam(*pd,1)
 
;или так по ссылке на переменную?нужна структура объявленная
 
Procedure.i GetExtCallParam(*lParam.LPARAM ,nIndex)
 
  If *lParam\lParam >= (nIndex + 1) * 4
    ProcedureReturn *lParam\lParam  + nIndex;
   EndIf
    ProcedureReturn 0
EndProcedure
GetExtCallParam(@*pd\LPARAM ,1)
;или передавать сразу переменную для проверки а не ссылки на неё?
 
Procedure.i GetExtCallParam(LPARAM ,nIndex)
 
  If lParam >= (nIndex + 1) * 4
    ProcedureReturn lParam  + nIndex;
   EndIf
    ProcedureReturn 0
EndProcedure
 
deGetExtCallParam(*pd\LPARAM ,1)
 
 
 
 
 
 
 
 
 
 



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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик писал(а):
Код:
1
If lParam >= (nIndex + 1) * 4


lParam это указатель на структуру параметров, при таком сравнении он всегда будет больше правой части выражения условия. Посмотри в мессаге, lParam =8943596 в общем огромное число, так как это указатель, а правая часть это размер структуры 1*1+4=5 и здесь 4 только для x86. А если я беру PeekI(*lParam), то получаю первое поле структуры по указателю которое равно размеру структуры (так задумано автором).

Сейчас главная проблема чтобы AkelPad не падал, если пользователь в параметрах будет указавать число или строку
Код:
1
2
"1test_test_Arg" Call("1test::test_Arg", "12") Icon(38)
"1test_test_Arg" Call("1test::test_Arg", 12) Icon(38)


первая кнопка-команда передаёт строку "12", вторая число 12, при этом сам AkelPad переводит формат, то есть я бы мог получить в обоих случаях строки 12 или "12", вместо этого получаю разные типы. Моя задача правильно считать данные.

Сергейчик
Вот мой полный пример для теста плага (с моими инклудами от предыдущего плага подсветки), чтобы тебе было легче проверить. Кнопки я тебе уже дал. Мессага сейчас работает, если параметр "12" является строка. А если число, то поменяй условие, а то просто упадёт AkelPad.
пример
Код:
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
EnableExplicit
 
Global *g_pd = 0 ; указатель на структуру, получаемый свой адрес в GUI
 
XIncludeFile "constants_AkelDLL.pb"
XIncludeFile "constants_AkelEdit.pb"
XIncludeFile "Structures.pb"
; XIncludeFile "IncludeAkelpad.pbi"
 
Macro MAKEWORD(a, b);тот же принцип только с байтами, младшие 8бит,старшие 8бит=возвращаемое значение 1б битное слово
        ((a & $ff)|((b & $ff)<< 8))
EndMacro
Macro MAKELONG(major,minor);младшие 16бит,старшие 16бит=возвращаемое значение 32бита
        ((major &  $ffff)|((minor &  $ffff) << 16))
EndMacro
Macro MAKE_IDENTIFIER(a, b, c, d)
        MAKELONG(MAKEWORD(a, b), MAKEWORD(c, d))
EndMacro
 
; идентификация
ProcedureCDLL DllAkelPadID(*pv.PLUGINVERSION)
        *pv\dwAkelDllVersion = MAKE_IDENTIFIER(2, 2, 2, 0)
        *pv\dwExeMinVersion3x = MAKE_IDENTIFIER(-1, -1, -1, -1)
        *pv\dwExeMinVersion4x = MAKE_IDENTIFIER(4, 9, 6, 0)
        *pv\pPluginName = @"MyPlugin"
EndProcedure
 
Procedure GetExtCallParam(*lParam, nIndex)
        If PeekI(*lParam) >= (nIndex + 1) * SizeOf(*lParam) ; если размер структуры больше или равен индексу умноженному на размер указателя структуры
                ProcedureReturn *lParam + nIndex * SizeOf(*lParam) ; возвращает указатель на поле структуры
        EndIf
        ProcedureReturn 0
EndProcedure
 
Procedure IsExtCallParamValid(*lParam, nIndex)
        If PeekI(*lParam) >= (nIndex + 1) * SizeOf(*lParam)
                ProcedureReturn #True
        EndIf
        ProcedureReturn #False
EndProcedure
 
; Внутреняя функция
; Пример вызова плагина "1test::test_Arg" с парамерами, например 12 или "привет".
ProcedureCDLL test_Arg(*pd.PLUGINDATA)
        Protected *nAction, nArg;, *Arg.ArgData
        If *pd\lParam
                *nAction = GetExtCallParam(*pd\lParam, 1)
                nArg = PeekI(*nAction) ; nArg это либо число, либо указатель на строку
               
                If nArg > 0 Or nArg < 13 ; если число больше 13, то не обязательно указатель
                        MessageRequester("Строка", PeekS(nArg))
                Else
                        MessageRequester("Число", Str(nArg))
                EndIf
        EndIf
EndProcedure



Я смотрю код и не вижу конвертирование типа
Код:
1
2
3
4
if (IsExtCallParamValid(pd->lParam, 2))
nExtMenuIndex=(int)GetExtCallParam(pd->lParam, 2);
if (IsExtCallParamValid(pd->lParam, 3))
pSearchString=(unsigned char *)GetExtCallParam(pd->lParam, 3);


Просто считываемому параметру задаётся тип (unsigned char *), при этом если я в параметре вместо строки передам число, то AkelPad не упадёт. Вопрос, как он это делает?

Со структурой StructureUnion не получится, так как там объединение не строки и числа, а указателя и числа, а это в принципе не решает проблемы. Сделал просто если параметр не равен вариантам режима (1-6 или 1-10 или 1-2), то вероятнее всего это указатель.


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
А Как через мессагу прлучить указатель на текущию структуру окна plugindata?
переделал смотрелку байтов на пуриковский вариант(асм что то падает)
правда hex выводит байт без лидирующего нуля пришлось самому добавлять. :D
Код:
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
 
#RazmerMemory=$80000000
#RazmerByte=1
#RazmerWord=2
#RazmerDword=4
#RazmerQword=8
Global s.s=Space(100);testovay
Procedure.i GetMemoryHex2(*bait,type.i,type2.i);Вывод байтов  из памяти в строковый буфер как hex значения в символьном юникоде utf-16
  Protected *|/2/>dec.integer
  Protected number.i
  Protected *i.byte
  Protected st.s
!and dword [p.v_type2],$7FFFFFFF
!jz netr2
type*type2
!netr2:
type+*bait
;If type2<0
 ; type2 & $7FFFFFFF
 ; type*type2
;EndIf
  ;type+*bait
st+Str(number)+"  "
rkb65:
For *i.byte=*bait+type2-1 To *bait Step -1
  If Len(Hex(*i\b,#PB_Byte))=1
    st+"0"+Hex(*i\b,#PB_Byte)
    Else
      st+Hex(*i\b,#PB_Byte)
  EndIf  
Next
number+1
*|/2/>dec=*bait
st+"  "+Str(*|/2/>dec\i)+#CRLF$+Str(number)+"  "
*bait+type2
 
If *bait<type
  Goto rkb65
EndIf
;ProcedureReturn *bait adres смещения на следующий байт
  MessageRequester("test",st)
EndProcedure
GetMemoryHex2(@s,30,#RazmerMemory|#RazmerDword)
 



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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Обновил плаг ConvKey используя параметры. В моём случае AkelPad не упадёт, потому что либо получаю валидные параметры, либо всё равно число-указатель на строку, который просто отсеивается по величине.
Код:
1
2
"Исправить набор ConvKey" Call("ConvKey::ConvKey")
"Транслит ConvKey" Call("ConvKey::ConvKey", 2)



Хотел задействовать высылку хоткеев для автоматического выделения текста, но AkelPad их обрабатывает только когда плаг завершит функцию.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
Procedure SendHotKeyCtrlShiftL(sleep = 20, sleep1=3)
        keybd_event_(#VK_SHIFT,0,#KEYEVENTF_EXTENDEDKEY,0)
        Delay(sleep1)
        keybd_event_(#VK_CONTROL,0,#KEYEVENTF_EXTENDEDKEY,0)
        Delay(sleep1)
        keybd_event_(#VK_LEFT, 0, #KEYEVENTF_EXTENDEDKEY, 0)
        Delay(sleep)
        keybd_event_(#VK_LEFT,0,#KEYEVENTF_KEYUP | #KEYEVENTF_EXTENDEDKEY,0)
        Delay(sleep1)
        keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP | #KEYEVENTF_EXTENDEDKEY,0)
        Delay(sleep1)
        keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP | #KEYEVENTF_EXTENDEDKEY,0)
EndProcedure



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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AZJIO писал(а):
AkelPad их обрабатывает только когда плаг завершит функцию
Если плагин не выгружается, можно выполнить код в другом потоке когда произведен выход из функции плагина.

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Lparam.lparam это структура на переменную типа лонг вроде бы.соответственно это как бы значение переменной по указателю а не указазатель на структуру параметров.
А то что ты делаешь в плагине === "*g_pd = @*pd ; запоминает указатель на структуру, чтобы использовать при вызове внутренних функций".===а после используешь peekl() это абсурд какой то. :roll:
Ps:тем более *pd.pugindata(адрес в стеке процедуры) и это @*pd получается типа указатель на ячейку памяти стека где хранится адрес переременной.и зачем это?когда можно хранить сразу адрес на структуру в своей переменной *PLUGINDATA.PLUGINDATA=*pd.PLUGINDATA.
Только вот она на одно открытое окно и нужно знать как получать ссылку на неё либо с отдельных окон где она может храниться либо она одна программная и при открытии окон в неё пишются параметры на окно в фокусе. :roll:


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

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

@ даёт адрес на некие данные, а peekl считывает данные - не одно и тоже. Процедуре передаётся указатель на структуру, она из указателя создаёт структуру. Когда я перевёл функции из экспортных во внутренние, то мне никто не передаёт указатель, я должен его сам передать. А откуда я знаю что передать? Я при вызове экспортной функции сохранил указатель на структуру в глобальную переменную-указатель, а потом при вызове своей функции передаю ей тот указатель, который передаёт AkelPad и при этом я не переделываю в процедуре, и внутри создаётся структура для доступа к элементам структуры как и раньше. Но логично сделать глобальную структуру, но как её сделать не вызвав функцию? Надо же передать адрес структуры, а я его получаю только после вызова экспортной функции.
Если хочешь показать свой простой пример покажи, я переделаю как у тебя если это будет работать.

Когда я создаю структуру из указателя я просто создаю адреса к полям, то есть *pd\dwSupport это адрес, он отсчитывается от указателя начала структуры, определяется размер поля структуры и делает сдвиг на этот размер и получает адрес поля ассоциированный с именем. То есть я не создаю новые данные, я создаю имена-указатели на поля имеющихся данных в памяти. После завершения процедуры все это удаляется.

Ты предлагаешь сделать *g_pd = *pd, а потом без peekl передавать *g_pd? Наверно. Как будет выходной, так сразу.


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Если бы мы взяли указатель на постоянную структуру акелпада то она была бы неизменной даже если бы в неё писались изменённые данные(я такую делаю в своём эксперементальном канвасе, ссылку на её инициализирую заранее для пользователя и а неё пишу все параметры заранее что бы пользователь уже пользовался ей,вобщем это внутренняя структура(с её полем переменных под данные) на которую у пользователя ссалка(адрес)и он может взять все параметры по переменным,это сделано из соображения того что окно и данные его могут быть динамическими и мне проще туда их запихнуть заранее и освободить пользователя от лишних процедур,это всё в фокусе на конкретное окно.думаю так проще чем привязывать к отдельному окну все переменные),но тут как будто у каждого окна своя структура и соответственно и адрес у неё свой который в фокусе на окно передаётся в программу но не как не в плагин где допустим в тестовую процедуру зашли с сылкой на структуру на уже открытое окно акелпада,соответственно адрес структуры неизменный даже если тест с другого открытого окна. :roll:
Ps:Да перехватил калбек в плагине акелпада и своё окно либо закрываю либо оно закрывается вперёд акелпада если он закрывается,для этого шлю сообщение закрытия из потока акелпада в свой поток что бы он завершился. :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
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
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
 
#RazmerMemory=$80000000
#RazmerByte=1
#RazmerWord=2
#RazmerDword=4
#RazmerQword=8
 
Procedure.i GetMemoryHex2(*bait,type.i,type2.i);Вывод байтов  из памяти в строковый буфер как hex значения в символьном юникоде utf-16
  Protected *|/2/>dec.integer;должно быть *dec.integer.сообщение сайта тупит
  Protected number.i
  Protected *i.byte
  Protected st.s
!and dword [p.v_type2],$7FFFFFFF
!jz netr2
type*type2
!netr2:
type+*bait
;If type2<0
 ; type2 & $7FFFFFFF
 ; type*type2
;EndIf
  ;type+*bait
st+Str(number)+"  "
rkb65:
For *i.byte=*bait+type2-1 To *bait Step -1
  If Len(Hex(*i\b,#PB_Byte))=1
    st+"0"+Hex(*i\b,#PB_Byte)
    Else
      st+Hex(*i\b,#PB_Byte)
  EndIf  
Next
number+1
*|/2/>dec=*bait
st+"  "+Str(*|/2/>dec\i)+#CRLF$+Str(number)+"  "
*bait+type2
 
If *bait<type
  Goto rkb65
EndIf
;ProcedureReturn *bait adres смещения на следующий байт
  SetGadgetText(400,st)
EndProcedure
 
;;;
 
Procedure.i test(*pd.PLUGINDATA);тест структуры PLUGINDATA
        *pd\dwSupport | #PDS_NOAUTOLOAD
        If *pd\dwSupport & #PDS_GETSUPPORT
                ProcedureReturn 0
        EndIf
       
       
                ;SendMessage_(*pd\hMainWnd, #WM_COMMAND, #IDM_FILE_OPEN, 0);открытть нновый файл
 
        Protected res.s = ""
        res +"Адрес структуры PLUGINDATA  " + Str(*pd)+#CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\cb)) + ", PLUGINDATA\cb = " + Str(*pd\cb) + #CRLF$
        ;
         res +"====structura *PLUGINCALLSENDW =====" + #CRLF$
         Protected *pcs.PLUGINCALLSENDW =*pd\lpPLUGINCALLSENDW
        res +"Ссылка на структуру PLUGINDATA\*PLUGINCALLSENDW  " + Str(*pd\lpPLUGINCALLSENDW)+#CRLF$
        res + "SizeOf = " + Str(SizeOf(*pcs\pFunction)) + ", *pcs\*pFunction = "+ Str(*pcs\pFunction) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pcs\lparam)) + ", *pcs\lparam = "+ Str(*pcs\lparam) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pcs\dwSupport)) + ", *pcs\dwSupport = "+ Str(*pcs\dwSupport) + #CRLF$
  res + "SizeOf = " + Str(SizeOf(*pcs\nResult)) + ", *pcs\*nResult = "+ Str(*pcs\nResult) + #CRLF$
        res +"====ENDstructura PLUGINCALLSENDW =====" + #CRLF$
        ;==================================
        res + "SizeOf = " + Str(SizeOf(*pd\dwSupport)) + ", PLUGINDATA\dwSupport = " + Str(*pd\dwSupport) + #CRLF$
  If *pd\bOldWindows=#True
          res + " PLUGINDATA\*pFunction = " + PeekS(*pd\pFunction,-1, #PB_Ascii) + #CRLF$
        ElseIf  *pd\bOldWindows=#False
          res + " PLUGINDATA\*pFunction = " + PeekS(*pd\pFunction,-1, #PB_Unicode) + #CRLF$
        EndIf
 
        res + "SizeOf = " + Str(SizeOf(*pd\szFunction)) + ", PLUGINDATA\*szFunction = " + PeekS(*pd\szFunction, -1, #PB_Ascii) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\wszFunction)) + ", PLUGINDATA\*wszFunction = " + PeekS(*pd\wszFunction, -1, #PB_Unicode) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\lParam)) + ", PLUGINDATA\lParam = " + Str(*pd\lParam) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hInstanceDLL)) + ", PLUGINDATA\hInstanceDLL = " + Str(*pd\hInstanceDLL) + #CRLF$
        ;
  ;==========================
         res +"====structura PLUGINFUNCTION =====" + #CRLF$
         Protected *lpPluginFunction.PLUGINFUNCTION=*pd\lpPluginFunction
         res +"Ссылка на структуру PLUGINDATA\*PLUGINFUNCTION " + Str(*pd\lpPluginFunction)+#CRLF$
         
        If *pd\bOldWindows=#True
          res + " PLUGINFUNCTION\*pFunction = " + PeekS(*lpPluginFunction\pFunction,-1, #PB_Ascii) + #CRLF$
        ElseIf  *pd\bOldWindows=#False
          res + " PLUGINFUNCTION\*pFunction = " + PeekS(*lpPluginFunction\pFunction,-1, #PB_Unicode) + #CRLF$
        EndIf  
       
          res + " PLUGINFUNCTION\szFunction = " + PeekS(@*lpPluginFunction\szFunction, -1, #PB_Ascii) + #CRLF$
          res + " PLUGINFUNCTION\wszFunction = " + PeekS(@*lpPluginFunction\wszFunction, -1, #PB_Unicode) + #CRLF$
 
 
        res +"====ENDstructura PLUGINFUNCTION =====" + #CRLF$
        ;=====================================================
       
       
        res + "SizeOf = " + Str(SizeOf(*pd\nUnload)) + ", PLUGINDATA\nUnload = " + Str(*pd\nUnload) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\bInMemory)) + ", PLUGINDATA\bInMemory = " + Str(*pd\bInMemory) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\bOnStart)) + ", PLUGINDATA\bOnStart = " + Str(*pd\bOnStart) + #CRLF$
                res + "SizeOf = " + Str(SizeOf(*pd\szAkelDir)) + ", PLUGINDATA\*szAkelDir = " + PeekS(*pd\szAkelDir, -1, #PB_Ascii) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\wszAkelDir)) + ", PLUGINDATA\*wszAkelDir = " + PeekS(*pd\wszAkelDir, -1, #PB_Unicode) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hInstanceEXE)) + ", PLUGINDATA\hInstanceEXE = " + Str(*pd\hInstanceEXE) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\nSaveSettings)) + ", PLUGINDATA\nSaveSettings = " + Str(*pd\nSaveSettings) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMainWnd)) + ", PLUGINDATA\hMainWnd = " + Str(*pd\hMainWnd) + #CRLF$
       
       
        ;==============================
        res +"====structura FRAMEDATA =====" + #CRLF$
        Protected *lpFrameData.FRAMEDATA=*pd\lpFrameData
        res +"Ссылка на структуру PLUGINDATA\*FRAMEDATA " + Str(*pd\lpFrameData)+#CRLF$
       
        res + "SizeOf = " + Str(SizeOf(*lpFrameData\nFrameID)) + "FrameData\nFrameID = " + Str(*lpFrameData\nFrameID) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*lpFrameData\hWndEditParent)) + "FrameData\hWndEditParent = " + Str(*lpFrameData\hWndEditParent) + #CRLF$
       
        ;{;---------------------PLUGINDATA\*FRAMEDATA\EDITINFO
        res +"====Вложенная структура в структуру FRAMEDATA=PLUGINDATA\*FRAMEDATA\EDITINFO =====" + #CRLF$
         Protected  *EDITINFO.EDITINFO=@*lpFrameData\EDITINFO
       
         ;res + "SizeOf = " + Str(SizeOf(*lpFrameData\EDITINFO\hWndEdit)) + ", EDITINFO\hWndEdit = " + Str(*lpFrameData\EDITINFO\hWndEdit) + #CRLF$;не может понять вложенную структуру
 
          res + "SizeOf = " + Str(SizeOf(*EDITINFO\hWndEdit)) + ", EDITINFO\hWndEdit = " + Str(*EDITINFO\hWndEdit) + #CRLF$
          res + "SizeOf = " + Str(SizeOf(*EDITINFO\hDocEdit)) + ", EDITINFO\hDocEdit = " + Str(*EDITINFO\hDocEdit) + #CRLF$
          ;
          ;показывает ссылку когда файл загружен
        If *pd\bOldWindows=#True
          res + "EDITINFO\*pFile = " + PeekS(*EDITINFO\pFile,-1, #PB_Ascii) + #CRLF$
        ElseIf  *pd\bOldWindows=#False
          res + "EDITINFO\*pFile = " + PeekS(*EDITINFO\pFile,-1, #PB_Unicode) + #CRLF$
        EndIf
    res + "EDITINFO\*szFile = " + PeekS(*EDITINFO\szFile, -1, #PB_Ascii) + #CRLF$      
    res + "EDITINFO\*wszFile = " + PeekS(*EDITINFO\wszFile, -1, #PB_Unicode) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\nCodePage)) + ", EDITINFO\nCodePage = " + Str(*EDITINFO\nCodePage) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\bBOM)) + ", EDITINFO\bBOM = " + Str(*EDITINFO\bBOM) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\nNewLine)) + ", EDITINFO\nNewLine = " + Str(*EDITINFO\nNewLine) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\bModified)) + ", EDITINFO\bModified = " + Str(*EDITINFO\bModified) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\bReadOnly)) + ", EDITINFO\bReadOnly = " + Str(*EDITINFO\bReadOnly) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\bWordWrap)) + ", EDITINFO\bWordWrap = " + Str(*EDITINFO\bWordWrap) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\bOvertypeMode)) + ", EDITINFO\bOvertypeMode = " + Str(*EDITINFO\bOvertypeMode) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\hWndMaster)) + ", EDITINFO\hWndMaster = " + Str(*EDITINFO\hWndMaster) + #CRLF$
    res + "SizeOf = " + Str(SizeOf(*EDITINFO\hDocMaster)) + ", EDITINFO\hDocMaster = " + Str(*EDITINFO\hDocMaster) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\hWndClone1)) + ", EDITINFO\hWndClone1 = " + Str(*EDITINFO\hWndClone1) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\hDocClone1)) + ", EDITINFO\hDocClone1 = " + Str(*EDITINFO\hDocClone1) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\hWndClone2)) + ", EDITINFO\hWndClone2 = " + Str(*EDITINFO\hWndClone2) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\hDocClone2)) + ", EDITINFO\hDocClone2 = " + Str(*EDITINFO\hDocClone2) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\hWndClone3)) + ", EDITINFO\hWndClone3 = " + Str(*EDITINFO\hWndClone3) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*EDITINFO\hDocClone3)) + ", EDITINFO\hDocClone3 = " + Str(*EDITINFO\hDocClone3) + #CRLF$
     ;
    res +"====ENDstructura EDITINFO =====" + #CRLF$
    ;};-------------------------------------------
    res + " *FrameData\*szFile = " + PeekS(@*lpFrameData\szFile, -1, #PB_Ascii) + #CRLF$
    res + " FrameData\*wszFile = " + PeekS(@*lpFrameData\wszFile, -1, #PB_Unicode) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*lpFrameData\nFileLen)) + ", FrameData\nFileLen = " + Str(*lpFrameData\nFileLen) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*lpFrameData\nStreamOffset)) + ", FrameData\nStreamOffset = " + Str(*lpFrameData\nStreamOffset) + #CRLF$
     res + " *lpFrameData\wszFileDir = " + PeekS(@*lpFrameData\wszFileDir, -1, #PB_Unicode) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*lpFrameData\nFileDirLen)) + ", FrameData\nFileDirLen = " + Str(*lpFrameData\nFileDirLen) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*lpFrameData\hIcon)) + ", FrameData\hIcon = " + Str(*lpFrameData\hIcon) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*lpFrameData\nIconIndex)) + ", FrameData\nIconIndex = " + Str(*lpFrameData\nIconIndex) + #CRLF$
     ;
     Protected *r.rect=@*lpFrameData\rcEditWindow
     res + "SizeOf = " + Str(SizeOf(*r\Left)) + ", FrameData\rcEditWindow\Left = " + Str(*r\Left) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*r\top)) + ", FrameData\rcEditWindow\top = " + Str(*r\top) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*r\right)) + ", FrameData\rcEditWindow\right = " + Str(*r\right) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*r\bottom)) + ", FrameData\rcEditWindow\bottom = " + Str(*r\bottom) + #CRLF$
     ;
     *r.rect=@*lpFrameData\rcMasterWindow
     res + "SizeOf = " + Str(SizeOf(*r\Left)) + ", FrameData\rcMasterWindow\Left = " + Str(*r\Left) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*r\top)) + ", FrameData\rcMasterWindow\top = " + Str(*r\top) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*r\right)) + ", FrameData\rcMasterWindow\right = " + Str(*r\right) + #CRLF$
     res + "SizeOf = " + Str(SizeOf(*r\bottom)) + ", FrameData\rcMasterWindow\bottom = " + Str(*r\bottom) + #CRLF$
     ;
     res + "SizeOf = " + Str(SizeOf(*lpFrameData\dwLockInherit)) + ", FrameData\dwLockInherit = " + Str(*lpFrameData\dwLockInherit) + #CRLF$
     Protected *LOGFONTW.LOGFONTW=@*lpFrameData\LOGFONTW
     
     
     
     
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\bTabStopAsSpaces)) + ", FrameData\bTabStopAsSpaces = " + Str(*lpFrameData\bTabStopAsSpaces) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\dwCaretOptions)) + ", FrameData\dwCaretOptions = " + Str(*lpFrameData\dwCaretOptions) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\dwMouseOptions)) + ", FrameData\dwMouseOptions = " + Str(*lpFrameData\dwMouseOptions) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\nClickURL)) + ", FrameData\nClickURL = " + Str(*lpFrameData\nClickURL) + #CRLF$
           res + "SizeOf = " + Str(SizeOf(*lpFrameData\bUrlPrefixesEnable)) + ", FrameData\bUrlPrefixesEnable = " + Str(*lpFrameData\bUrlPrefixesEnable) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\bUrlDelimitersEnable)) + ", FrameData\bUrlDelimitersEnable = " + Str(*lpFrameData\bUrlDelimitersEnable) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\bWordDelimitersEnable)) + ", FrameData\bWordDelimitersEnable = " + Str(*lpFrameData\bWordDelimitersEnable) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\bWrapDelimitersEnable)) + ", FrameData\bWrapDelimitersEnable = " + Str(*lpFrameData\bWrapDelimitersEnable) + #CRLF$
      res + "SizeOf = " + Str(SizeOf(*lpFrameData\dwMappedPrintWidth)) + ", FrameData\dwMappedPrintWidth = " + Str(*lpFrameData\dwMappedPrintWidth) + #CRLF$
     
     
     
    ;пока надоело ковырять
        res +"====ENDstructura FRAMEDATA =====" + #CRLF$
       
       
       
       
       
        res + "SizeOf = " + Str(SizeOf(*pd\hWndEdit)) + ", PLUGINDATA\hWndEdit = " + Str(*pd\hWndEdit) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hDocEdit)) + ", PLUGINDATA\hDocEdit = " + Str(*pd\hDocEdit) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hStatus)) + ", PLUGINDATA\hStatus = " + Str(*pd\hStatus) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMdiClient)) + ", PLUGINDATA\hMdiClient = " + Str(*pd\hMdiClient) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hTab)) + ", PLUGINDATA\hTab = " + Str(*pd\hTab) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMainMenu)) + ", PLUGINDATA\hMainMenu = " + Str(*pd\hMainMenu) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMenuRecentFiles)) + ", PLUGINDATA\hMenuRecentFiles = " + Str(*pd\hMenuRecentFiles) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMenuLanguage)) + ", PLUGINDATA\hMenuLanguage = " + Str(*pd\hMenuLanguage) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hPopupMenu)) + ", PLUGINDATA\hPopupMenu = " + Str(*pd\hPopupMenu) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMainIcon)) + ", PLUGINDATA\hMainIcon = " + Str(*pd\hMainIcon) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hGlobalAccel)) + ", PLUGINDATA\hGlobalAccel = " + Str(*pd\hGlobalAccel) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\hMainAccel)) + ", PLUGINDATA\hMainAccel = " + Str(*pd\hMainAccel) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\bOldWindows)) + ", PLUGINDATA\bOldWindows = " + Str(*pd\bOldWindows) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\bOldRichEdit)) + ", PLUGINDATA\bOldRichEdit = " + Str(*pd\bOldRichEdit) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\dwVerComctl32)) + ", PLUGINDATA\dwVerComctl32 = " + Str(*pd\dwVerComctl32) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\bAkelEdit)) + ", PLUGINDATA\bAkelEdit = " + Str(*pd\bAkelEdit) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\nMDI)) + ",PLUGINDATA\nMDI = " + Str(*pd\nMDI) + #CRLF$
                If *pd\bOldWindows=#True
          res + " PLUGINDATA\*pLangModule = " + PeekS(*pd\pLangModule,-1, #PB_Ascii) + #CRLF$
        ElseIf  *pd\bOldWindows=#False
          res + " PLUGINDATA\*pLangModule = " + PeekS(*pd\pLangModule,-1, #PB_Unicode) + #CRLF$
        EndIf
        res + "SizeOf = " + Str(SizeOf(*pd\szLangModule)) + ", PLUGINDATA\*wszLangModule = " + PeekS(*pd\szLangModule, -1, #PB_Ascii) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\wszLangModule)) + ", PLUGINDATA\*wszLangModule = " + PeekS(*pd\wszLangModule, -1, #PB_Unicode) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\Hlangmodule)) + ", PLUGINDATA\Hlangmodule = " + Str(*pd\Hlangmodule) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\wLangSystem)) + ", PLUGINDATA\wLangSystem = " + Str(*pd\wLangSystem) + #CRLF$
        res + "SizeOf = " + Str(SizeOf(*pd\wLangModule)) + ", PLUGINDATA\wLangModule = " + Str(*pd\wLangModule) + #CRLF$
       
        ;MessageRequester("Структура PLUGINDATA", res)
        SetGadgetText(400,res)
        res.s = ""
  ;ProcedureReturn #UD_NONUNLOAD_ACTIVE
EndProcedure
Global *PLUGINDATA.PLUGINDATA
Global adresrodogocalbaka_akella.i
Procedure.i calbak_akella(hWnd, Msg, wParam, lParam)
  Protected Rezultat.i
  ;Static number.l
  Select Msg
     Case #WM_CREATE
       SendMessage_(WindowID(0), 1, 1, -999);эт типа я тесты делаю через сообщение открытия.......
       
     Case #WM_COMMAND;меню акеллы
       Select wParam
       Case #IDM_FILE_EXIT;закрытие акелпада из меню работает и так посылая после #WM_CLOSE
       ; If IsWindow(0)
        ;  SendMessage_(WindowID(0),#WM_CLOSE,0,0);посылаем окну плага и его потоку закрыться перед закрытием акелпада
         ; ProcedureReturn DefWindowProc_( hWnd, Msg, wParam, lParam)
       ; EndIf
         
       Case #IDM_FILE_NEW;открываем новый файл получаем адрес структуры *PLUGINDATA(мои думки)
         
       Case #IDM_FILE_CREATENEW
       
         Case #IDM_FILE_OPEN
         
       EndSelect
       
     Case #WM_CLOSE;акелпад закрывается проверяем нашу длл с плагом есть ли открытое окно и закрываем его если открыто
 
        If IsWindow(0)
           SendMessage_(WindowID(0),#WM_CLOSE,0,0);посылаем окну и его потоку закрыться перед закрытием акелпада
          ProcedureReturn DefWindowProc_( hWnd, Msg, wParam, lParam)
         EndIf
  EndSelect
; SendMessage_(WindowID(0), 1, Msg, wParam)
  Rezultat=CallWindowProc_(adresrodogocalbaka_akella, hWnd, Msg, wParam, lParam);прыгнем в родной обработчик акелпада
  ;
 
ProcedureReturn Rezultat;DefWindowProc_( hWnd, Msg, wParam, lParam)
 
  ;ProcedureReturn DefWindowProc_( hWnd, Msg, wParam, lParam)
EndProcedure
 
Procedure forma()
OpenWindow(0, 0, 0,500,600, "Тест акелпада",#WS_EX_LEFT|#WS_SYSMENU| #WS_MINIMIZEBOX | #WS_MAXIMIZEBOX)
EditorGadget(400,60,60,380,480)
ButtonGadget(401,0,0,100,20,"Тест структуры PLUGINDATA")
ButtonGadget(402,110,0,100,20,"PLUGINDATA в байтах")
ButtonGadget(403,220,0,100,20,"zagruzka asm list v okno akelly")
ButtonGadget(404,320,0,100,20,"Радио")
EndProcedure
 
 
ProcedureCDLL.i Test_PLUGINDATA(*pd.PLUGINDATA)
        ; Функция не поддерживает автозагрузку
        *pd\dwSupport | #PDS_NOAUTOLOAD
        If *pd\dwSupport & #PDS_GETSUPPORT
                ProcedureReturn 0
        EndIf
       
        *PLUGINDATA.PLUGINDATA=*pd.PLUGINDATA;забераем адрес внутренней структуры но данные тут в структуре на окно при запуске плагина статичееские и неизменны при фокусе на другое окно
 
        adresrodogocalbaka_akella=SetWindowLongPtr_(*pd\hMainWnd,#GWL_WNDPROC,@calbak_akella());назначаем свой обработчик на акелпад
       
        forma()
 
Repeat
  Select WaitWindowEvent()
     
    Case #PB_Event_CloseWindow
 
      Break
 
    Case #PB_Event_Gadget
     Select EventGadget()      
         Case 401
          test(*PLUGINDATA);*PLUGINDATA
         Case 402
           GetMemoryHex2(*PLUGINDATA,SizeOf(PLUGINDATA),#RazmerMemory|#RazmerDword)
         ; SetGadgetText(400,STROKAm)
         
         Case 403
        ;  Compiler(#MV_createAsm)
         Case 404
          ;SendMessage_(*PLUGINDATA\hMainWnd,  #AKD_DLLFINDW, @"Coder::HighLight", 0 )
      EndSelect
 
     
       Default
         ;MessageRequester(" #PB_Event", Str(WaitWindowEvent()))
        ; SetGadgetText(400,Str(WaitWindowEvent()))
  EndSelect
ForEver
SetWindowLongPtr_(*PLUGINDATA\hMainWnd,#GWL_WNDPROC,adresrodogocalbaka_akella);вернём на место адрес родного оброботчика и выйдем
 ;MessageRequester(" #PB_Event_CloseWindow2", "#PB_Event_CloseWindow2")
 ProcedureReturn #UD_NONUNLOAD_ACTIVE ; Не выгружать плагин и установить активный статус
EndProcedure
 
 


PPS:Наверно путанул в канвасе программная структура у меня а кустомедита на каждое окно своя внутренняя,но опять же нечего не мешает пользоватилю взять ссылку на ннё единожды...... :roll:


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик
Архивом бы выложил, а то пока исправлял 3 упоминания *dec.integer, потом структуры не видит, то твой инклуд прописал, то свои и всё равно не компилируется.
Почему ты процедуры лепишь друг ко другу? Самому то удобно так читать всё в куче? Уж некоторые и между блоками условий и циклов ставят пустую строку, а я игнорирую это, на до такой степени всё в куче так работает только обфускатор. И к тому же можно сделать "Форматировать код".

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


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

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


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

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


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

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