purebasic.info

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

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




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

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

Я тут пытаюсь сделать плаг для AkelPad. Нужна помощь, добился вызова функции, но после AkelPad падает. Возможно я размеры элементов структуры сделал неправильно. Может кто беглым взглядом определит не совпадающую ширину байт.
Для примера можно скачать плаг на С++ (или Си) здесь, 3-ий сверху AkelDLL (специально для примера)

Готовые плаги
Highlight
ConvKey


Последний раз редактировалось AZJIO Вс май 31, 2020 7:01 am, всего редактировалось 2 раз(а).

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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Структуры
Код:
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
Structure PLUGINVERSION Align #PB_Structure_AlignC 
    cb.l ; размер структуры
    hMainWnd.i ; дескриптор главного окна
    dwAkelDllVersion.l ; Текущая версия AkelPad
    dwExeMinVersion3x.l ; Минимальная поддерживаемая версия AkelPad_3. Неподдерживаемый вариант MAKE_IDENTIFIER(-1, -1, -1, -1)
    dwExeMinVersion4x.l ; Минимальная поддерживаемая версия AkelPad_4
    *pPluginName ; Имя плагина
 EndStructure
 
Structure PLUGINDATA Align #PB_Structure_AlignC
    cb.l ; размер структуры
    *pcs ; указатель на структуру PLUGINCALLSENDW (AkelDLL.h строка 1150)
    dwSupport.l ; когда запрашивающий хочет получить флаги PDS_* без выполнения функции
    *pFunction ; Вызываемое имя функции, в формате "Plugin::Function" (в юникоде, если bOldWindows = False)
    *szFunction ; Вызываемое имя функции (Ansi)
    *wszFunction ; Вызываемое имя функции (Unicode)
    lParam.i ; Входные данные (тип указатель или long?)
    hInstanceDLL.i ; Экземпляр DLL
    *lpPluginFunction ; указатель на структуру PLUGINFUNCTION (AkelDLL.h строка 1169)
    nUnload.i ; смотрите значения #define UD_*
    bInMemory.a ; Плагин уже загружен
    bOnStart.a ; Указывает, когда функция была вызвана: TRUE - на страрте, FALSE - вручную.
    *pAkelDir ; папка AkelPad (в юникоде, если bOldWindows = False)
    *szAkelDir ; папка AkelPad (Ansi)
    *wszAkelDir ; папка AkelPad (Unicode)
    hInstanceEXE.i ; Экземпляр EXE
    *hPluginsStack ; Стек плагинов, указатель на STACKPLUGINFUNCTION (AkelDLL.h строка 1187)
    nSaveSettings.i ; смотрите значения #define SS_*
    hMainWnd.i ; Главное окно
    *lpFrameData ; указатель на структуру FRAMEDATA (AkelDLL.h строка 1010)
    hWndEdit.i ; окно редактирования
    hDocEdit.i ; окно редактирование документа
    hStatus.i ; строка состояния
    hMdiClient.i ; Окно MDI, если nMDI = WMD_MDI
    hTab.i ; Окно Tab, если nMDI = WMD_MDI или WMD_PMDI
    hMainMenu.i ; Главное меню
    hMenuRecentFiles.i ; Меню последних файлов
    hMenuLanguage.i ; Языковое меню
    hPopupMenu.i ; Контекстное меню правой кнопкой мыши
    hMainIcon.i ; дескриптор иконки основного окна
    hGlobalAccel.i ; Глобальная таблица быстрых клавиш (высокий приоритет).
    hMainAccel.i ; Основная таблица быстрых клавиш (низкий приоритет).
    bOldWindows.a ; Флаг Windows без юникода
    bOldRichEdit.a ; Riched20.dll ниже, чем 5.30 (v3.0). Всегда FALSE
    dwVerComctl32.l ; Версия Comctl32.dll установлена как MAKELONG(major,minor).
    bAkelEdit.a ; Используется элемент AkelEdit. Всегда TRUE
    nMDI.i ; Режим окна, смотрите значения #define WMD_*
    *pLangModule ; Имя файла языкового модуля (в юникоде, если bOldWindows = False)
    *szLangModule ; Имя файла языкового модуля (Ansi)
    *wszLangModule ; Имя файла языкового модуля (Unicode)
    Hlangmodule.i ; Дескриптор языкового модуля
    wLangSystem.u ; Идентификатор языка системы
    wLangModule.u ; Идентификатор языка языкового модуля
 EndStructure
 
Structure MAKELONG
     StructureUnion
         Num.l
         byte.a[4]
     EndStructureUnion
 EndStructure

У экспортируемых функций должно быть соглашение вызова cdecl, т. е.
Код:
1
ProcedureCDLL OpenDialogTest(*pd.PLUGINDATA)


Это не сработает
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
; Точка входа 
 ProcedureDLL DllMain(hinstDLL, fdwReason, lpvReserved)
    If lpvReserved = #DLL_PROCESS_ATTACH
 
    ElseIf fdwReason = #DLL_THREAD_ATTACH
 
    ElseIf fdwReason = #DLL_THREAD_DETACH
 
    ElseIf fdwReason = #DLL_PROCESS_DETACH
 
    EndIf
    ProcedureReturn 1
 EndProcedure

Для этой цели предназначены процедуры AttachProcess, DetachProcess, AttachThread и DetachThread. https://www.purebasic.com/documentation ... e/dll.html

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


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Пётр
Код:
1
2
3
4
5
6
Structure MAKELONG 
     StructureUnion
         Num.l
         byte.a[4]
     EndStructureUnion
 EndStructure


у меня это не сработало, я изменил. Я там во втором посте обновил. Пока падает.
Да, я понял что те функции пусты, я кратко глянул инфу, что они нужны для Windows для их формата, но не вдавался.

Код:
1
ProcedureCDLL OpenDialogTest(*pd.PLUGINDATA)


За это спасибо, AkelPad перестал падать ))))

вот исходник и dll

Обновил архив: вывел значения элементов структуры в мессагу, чтобы проверить, правильно ли возвращаются результаты. Дескриптор = 2, вкладка = 0, явно не соответствует, будем подгонять.

Вот ещё размеры вывел в список
тест
cb = 172 = 4
dwSupport = -1073741823 = 4
lParam = 0 = 4
hInstanceDLL = 41353216 = 4
nUnload = 0 = 4
bInMemory = 0 = 1
bOnStart = 0 = 1
hInstanceEXE = 4710272 = 4
nSaveSettings = 4576976 = 4
hMainWnd = 2 = 4
hWndEdit = 126763480 = 4
hDocEdit = 4984932 = 4
hStatus = 126681576 = 4
hMdiClient = 6820662 = 4
hTab = 0 = 4
hMainMenu = 7406990 = 4
hMenuRecentFiles = 137956797 = 4
hMenuLanguage = 100927067 = 4
hPopupMenu = 448922629 = 4
hMainIcon = 135007369 = 4
hGlobalAccel = 772541317 = 4
hMainAccel = 653267205 = 4
bOldWindows = 61 = 1
bOldRichEdit = 6 = 1
dwVerComctl32 = 0 = 4
bAkelEdit = 0 = 1
nMDI = 655366 = 4
Hlangmodule = 4698656 = 4
wLangSystem = 45860 = 2
wLangModule = 71 = 2


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
Решил посмотреть ну и дебагнул функцию DllAkelPadID(*pv.PLUGINVERSION) та что в длл по ссылке на си или с+?
Вобщем смотрю на это
Код:
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
 
Structure PLUGINVERSION2 Align #PB_Structure_AlignC
    cb.l ; размер структуры
    hMainWnd.i ; дескриптор главного окна
    dwAkelDllVersion.l ; Текущая версия AkelPad
    dwExeMinVersion3x.l ; Минимальная поддерживаемая версия AkelPad_3. Неподдерживаемый вариант MAKE_IDENTIFIER(-1, -1, -1, -1)
    dwExeMinVersion4x.l ; Минимальная поддерживаемая версия AkelPad_4
    *pPluginName; Имя плагина
 EndStructure
Global pv.PLUGINVERSION2
Procedure r(*pv.PLUGINVERSION)
!mov     eax, [esp+4]
!Or      dword ptr eax+0Ch, 0FFFFFFFFh
!mov     dword ptr eax+8, 4000202h
!mov     dword ptr eax+10h, 70904h
EnableASM
mov     dword ptr eax+14h,aAkeldll
DisableASM
!retn 4
DataSection
  !aAkeldll:
 !du 'aAkeldll',0
EndDataSection
EndProcedure
 
r(@pv)
Debug pv\dwAkelDllVersion
Debug pv\dwExeMinVersion3x
Debug pv\dwExeMinVersion4x
Debug PeekS(pv\pPluginName,-1,#PB_Unicode)
 


Данные структуры кстате неотображалась в асплывающем окне(может подцепляемый файл в .pbi нужен?)
Но суть в другом то что в этой процедуре уже стоят статичные данные=равно они сформированны на этапе компиляции а не как у тебя через процедуру. :roll:
вобщем написал макросы и на тесте они как раз те данные что в процедуре показывают(надо в хекс переводить десятичные) :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
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
Debug MAKELONG(10,20)
Debug MAKE_IDENTIFIER(4, 9, 7, 0)
Debug MAKE_IDENTIFIER(2,2,0,4)
 
 



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

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

Добавил константы в инклуды, извлекая их с помощью регулярных выражений

Что-то SendMessage не хочет работать. Ни ошибки, ничего.

архив перезалил.

При вызове мессаги с размерами элементов структур и их данных я получил имя языковой dll, и менял флаги и это было корректно, что говорит что размеры элементов структуры правильные.


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
типа инклудника сделал константы и структуры(в некоторых могут быть неправильные типы) :roll:
Правда не указывал на структуры Align #PB_Structure_AlignC это принцепиально для редактора вызовы через cdecl?
и типа примера от туда. :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
 
 
;#include "AkelEdit.h"
XIncludeFile "IncludeAkelDLL"
 
 
;//Identification
ProcedureDLL DllAkelPadID(*pv.PLUGINVERSION )
  *pv\dwAkelDllVersion=MAKE_IDENTIFIER(2, 2, 0, 4)
  *pv\dwExeMinVersion3x=MAKE_IDENTIFIER(-1, -1, -1, -1);
  *pv\dwExeMinVersion4x=MAKE_IDENTIFIER(4, 9, 7, 0);
  *pv\pPluginName=@"AkelDLL";
EndProcedure
 
;//Plugin extern function
Structure CHARRANGE64
  *cpMin;
  *cpMax;
EndStructure;
#EM_EXGETSEL64 =(#WM_USER + 1952);объявлена в AkelEdit
ProcedureDLL.i GetSelTextTest(*pd.PLUGINDATA )
 Protected gtr.GETTEXTRANGE ;
 Protected cr.CHARRANGE64;разницы наверное нет
 
  ;//Function doesn't support autoload
  *pd\dwSupport|#PDS_NOAUTOLOAD;
  If (*pd\dwSupport & #PDS_GETSUPPORT)
    ProcedureReturn #False
  EndIf
  ;//Get current text selection
  CompilerIf #PB_Processor_x64
    SendMessage_(*pd\hWndEdit, #EM_EXGETSEL64, 0,@cr);
  CompilerElseIf #PB_Processor_x86
    SendMessage_(*pd\hWndEdit, #EM_EXGETSEL, 0,@cr)
  CompilerEndIf    
  gtr\cpMin=cr\cpMin;
  gtr\cpMax=cr\cpMax;
 
  ;//Get text from selection
  If (*pd\dwSupport & #PDS_STRANSI);есле текст в анси
 
    If SendMessage_(*pd\hMainWnd, #AKD_GETTEXTRANGEA, *pd\hWndEdit,@gtr)
   
      ;MessageBoxA_(*pd\hMainWnd, gtr\pText, "Test", #MB_OK);
      MessageRequester("Тест A", PeekS(gtr\pText, -1, #PB_Ascii))
      SendMessage_(*pd\hMainWnd, #AKD_FREETEXT, 0, gtr\pText);
      ProcedureReturn #PB_Ascii
    Else
     ; MessageBoxA_(*pd\hMainWnd, "Text doesn't selected", "Test", #MB_OK);
      MessageRequester("Тест A", "Текст  ANSI не выделен")
      ProcedureReturn #False
    EndIf
  Else;есле в юникоде
 
    If SendMessage_(*pd\hMainWnd, #AKD_GETTEXTRANGEW,*pd\hWndEdit,@gtr)
   
      ; MessageBoxW_(*pd\hMainWnd, gtr\pText, "Test", #MB_OK);
      MessageRequester("Тест A", PeekS(gtr\pText, -1, #PB_Unicode))
      SendMessage_(*pd\hMainWnd, #AKD_FREETEXT, 0, gtr\pText);
      ProcedureReturn #PB_Unicode
    Else
     ;MessageBoxW_(*pd\hMainWnd, "Text doesn't selected", "Test", #MB_OK);
      MessageRequester("Тест A", "Текст UNICODE не выделен")
      ProcedureReturn #False
    EndIf
  EndIf
 
  ProcedureReturn -1;текст в не известной кодировке
EndProcedure
 
;//Plugin extern function
ProcedureDLL.i OpenDialogTest(*pd.PLUGINDATA)
  ;//Function doesn't support autoload
  *pd\dwSupport|#PDS_NOAUTOLOAD;
  If (*pd\dwSupport & #PDS_GETSUPPORT)
    ProcedureReturn 0;
  EndIf
  SendMessage(*pd\hMainWnd, #WM_COMMAND, #IDM_FILE_OPEN, 0);
  ProcedureReturn #True;может на мессагу нужно?
EndProcedure
 
;//Entry point
ProcedureDLL.i DllMain(hinstDLL,fdwReason,lpvReserved)
 
  If (fdwReason = #DLL_PROCESS_ATTACH)
    ProcedureReturn  #False
  Else If (fdwReason = #DLL_THREAD_ATTACH)
   ProcedureReturn  #False
  Else If (fdwReason = #DLL_THREAD_DETACH)
    ProcedureReturn  #False
  Else If (fdwReason = #DLL_PROCESS_DETACH)
   ProcedureReturn  #False
  EndIf
   ProcedureReturn #True;
EndProcedure
 
 



Вложения:
Комментарий к файлу: инклудник
inklude.zip [29.09 KiB]
Скачиваний: 27
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Сб май 09, 2020 12:43 pm 
Не в сети
профессор

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
В структуре PLUGINFUNCTION должно быть
Код:
1
wszFunction.u[#MAX_PATH]; имя функции (Unicode)

ведь это имя в юникоде. Но можно использовать фиксированную строку
Код:
1
wszFunction.s{#MAX_PATH}; имя функции (Unicode)


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


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

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

Как раздобуду так сразу. :?


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

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


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

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

А чем же? :roll:
Константы только на десятичные подставил = другие на реплаке #define =#, 0x= = $, //= ;//


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Сергейчик
Твой пример у меня не работает. Я хочу попробовать загрузить DLL чтобы работать с функциями типа
Код:
1
AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/ , 4101 /*IDM_FILE_NEW*/ , 0);



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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
AZJIO писал(а):
Сергейчик
Твой пример у меня не работает. Я хочу попробовать загрузить DLL чтобы работать с функциями типа
Код:
1
AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/ , 4101 /*IDM_FILE_NEW*/ , 0);


Ну наверное вызовы с акелпада gdecl,подставь на структуры Align #PB_Structure_AlignC и пример с длл переделать на
procedureCDLL а может не так вызовы процедур делаешь?
PS:Кстате я вчера ещё один инклудник перевёл тебе может пригодится в проекте с дисками(за правильность типов вструктурах не гарантирую,в начале тоже непонятка с DEFINE_GUID()) :roll:


Вложения:
Комментарий к файлу: winioctl
includewinioctl.zip [42.23 KiB]
Скачиваний: 25
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: плагин для AkelPad
СообщениеДобавлено: Пн май 11, 2020 8:27 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
В общем как я и предполагал, что не может быть дескриптор равен "2" или может но будет занят на старте Windows. В общем я получаю дескриптор поиском окон и выделенный текст теперь получаю. И, кстати, дескриптор ввода *pd\hWndEdit тоже неправильный, тоже через поиск получил. Ну ещё к структурам добавил @, хотя надеялся, что имя-переменная структуры и есть сам адрес
Код:
1
2
3
4
5
6
7
8
9
10
11
        Protected hAkelPad = FindWindow_(@"AkelPad4",0)
        If hAkelPad
                *pd\hMainWnd = hAkelPad
;               MessageRequester("дескриптор получен окна", Str(hAkelPad))
        EndIf
;       Protected hWnd2 = FindWindow_(@"AkelEditW",0)
        Protected hAkelEdit = FindWindowEx_(hAkelPad, 0, "AkelEditW", 0)
        If hAkelEdit
                *pd\hWndEdit = hAkelEdit
;               MessageRequester("дескриптор получен Edit", Str(hAkelEdit))
        EndIf



Сергейчик
Цитата:
может пригодится в проекте с дисками
незнаю, пока там всё работает.

Сейчас ищу причину, почему дескрипторы я получаю неправильно из структуры. Допустим в структуре PLUGINDATA я получил указатель "*pLangModule ; Имя файла языкового модуля" и правильно прочитал из него текст, т.е. конец выровнен. Но я могу предположить, что в средине структуры я мог 1 раз сдвинуть поле вперёд на байт, а потом отыграть назад на 1 байт и концовка сошлась. Остаётся выверить другие элементы структуры. Допустим перед нужными полями я проверил *wszAkelDir, который при чтении дал путь, остаётся один указатель и 2 числа, мог ли я неправильно задать их размер? Размер указателя задаётся автоматически, два числа дескриптор и число хоть Long, хоть Integer всё равно 4 байта в x86. Теоретически я не ошибся, но дескриптор окна равен 2, на практике ошибка.

Ха, делаю nSaveSettings.q то есть 8 байт вместо 4, проверяю дескриптор, теперь сходится. Теперь надо где то вычесть 4 байта.


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1012
Благодарил (а): 2 раз.
Поблагодарили: 58 раз.
Пункты репутации: 9
AZJIO писал(а):
В общем как я и предполагал, что не может быть дескриптор равен "2" или может но будет занят на старте Windows. В общем я получаю дескриптор поиском окон и выделенный текст теперь получаю. И, кстати, дескриптор ввода *pd\hWndEdit тоже неправильный, тоже через поиск получил. Ну ещё к структурам добавил @, хотя надеялся, что имя-переменная структуры и есть сам адрес
Код:
1
2
3
4
5
6
7
8
9
10
11
        Protected hAkelPad = FindWindow_(@"AkelPad4",0)
        If hAkelPad
                *pd\hMainWnd = hAkelPad
;               MessageRequester("дескриптор получен окна", Str(hAkelPad))
        EndIf
;       Protected hWnd2 = FindWindow_(@"AkelEditW",0)
        Protected hAkelEdit = FindWindowEx_(hAkelPad, 0, "AkelEditW", 0)
        If hAkelEdit
                *pd\hWndEdit = hAkelEdit
;               MessageRequester("дескриптор получен Edit", Str(hAkelEdit))
        EndIf



Сергейчик
Цитата:
может пригодится в проекте с дисками
незнаю, пока там всё работает.

Сейчас ищу причину, почему дескрипторы я получаю неправильно из структуры. Допустим в структуре PLUGINDATA я получил указатель "*pLangModule ; Имя файла языкового модуля" и правильно прочитал из него текст, т.е. конец выровнен. Но я могу предположить, что в средине структуры я мог 1 раз сдвинуть поле вперёд на байт, а потом отыграть назад на 1 байт и концовка сошлась. Остаётся выверить другие элементы структуры. Допустим перед нужными полями я проверил *wszAkelDir, который при чтении дал путь, остаётся один указатель и 2 числа, мог ли я неправильно задать их размер? Размер указателя задаётся автоматически, два числа дескриптор и число хоть Long, хоть Integer всё равно 4 байта в x86. Теоретически я не ошибся, но дескриптор окна равен 2, на практике ошибка.

Ха, делаю nSaveSettings.q то есть 8 байт вместо 4, проверяю дескриптор, теперь сходится. Теперь надо где то вычесть 4 байта.

Так в моей структуре nSaveSettings.i(вот и 4байта?)это вобще может указатель адреса а x86 он 4байта. :roll:
я так понял акелпад на ричедит основан?


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

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


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

Сейчас этот форум просматривают: Kuzmat и гости: 7


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

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