Page 29 of 74
Posted: Fri Jan 28, 2011 2:59 pm
by Instructor
Не улавливаю смысла. Сейчас:
- Если эта dll ActiveX, то делается регистрация и ее загрузка с помощью ActiveXObject.
- Если эта dll не ActiveX, то делается вызов oSys.Call("lib.dll::Function") экпортируемой функции.
Posted: Fri Jan 28, 2011 4:57 pm
by FeyFre
Если эта dll не ActiveX, то делается вызов oSys.Call("lib.dll::Function") экпортируемой функции.
1.Тогда в чем смысл AkelPad.SendMessage? Это ведь точная копия oSys.Call("user32::SendMessage"+_TCHAR)
2.Так:
Code: Select all
AkelPad.Library("my_user32_proxy")
my_user32_proxy.SetWindowText(hwnd, "Hello")
vs
Code: Select all
var oSys = AkelPad.SystemFunction();
var str = "Hello"
var mem = AkelPad.MemAlloc((str.length+1)*_TSIZE/*и не факт что хватит*/);
AkelPad.MemCopy(mem, str, _TSTR);
oSys.Call("user32::Sleep",hwnd,mem);
AkelPad.MemFree(mem);
3. Доступ к кое-какому API я уже третий раз пытаюсь сделать - не получается. Получается такая трудночитаемая простыня, что я сразу его тру с концами.
Если эта dll ActiveX, то делается регистрация и ее загрузка с помощью ActiveXObject.
А вот из AkelPad-а делать второй IE я не стал бы.
И по моему проще написать одну функцию
Code: Select all
const EXPORTED_SYMBOL_STRUCT* WINAPI __declspec(dllexport) GetSymbols(const AKELPAD_SITE* pSite);
чем реализовать ActiveX объект(даже учитывая всевозможные фреймворки типа ATL). Я лично предпочитаю не связываться с COM без крайней необходимости.
ЗЫ: А в скрипте создать поток(oSys.Call("kernel32::CreateThread")) у меня вообще не получилось, а если и создался, то дождаться его используя WFSO не получалось ни разу. Может это потому что g_CurSysCallback->objFunction->lpVtbl->Invoke всегда выполняется в одном и том же потоке?
Posted: Fri Jan 28, 2011 5:43 pm
by Instructor
FeyFre
1.Тогда в чем смысл AkelPad.SendMessage?
Он появился раньше

2. Если вместо Sleep имеется ввиду SetWindowText, то с версии 7.0 можно вызывать так:
Code: Select all
oSys.Call("user32::SetWindowText" + _TCHAR, hwnd, "Hello");
oSys.Call("kernel32::CreateThread")
Для чего создавать поток, если каждый скрипт итак запускается в отдельном потоке?
Posted: Fri Jan 28, 2011 7:38 pm
by FeyFre
Если вместо Sleep имеется ввиду SetWindowText
ага. Это я автоподстановку недофиксил.
Оно то можно, но это покрывает только случай аргумента типа LPCTSTR. А как же другие?(Некоторые функции имею только A или W варианты) А с API структурами работа - мучение(а когда переехали на х64 - вдвойне стало). А WINAPI константы - это полный трындец.
Для чего создавать поток, если каждый скрипт итак запускается в отдельном потоке?
В одном потоке гуй, второй поток - делает задачу. И гуй не замерзает потому что задача не прокачивает user32 очередь.
Posted: Thu Feb 03, 2011 5:17 pm
by FeyFre
Пишу сюда, хотя формально хотелка не к плагину а к редактору(точнее к автору).
В файлы AkelDll.h, AkelEdit.h внести такие изменения:
у деклараций структур, для каждого их поля, где-то сбоку в комментарие поставить их смещение в байтах от начала структуры. Желательно для обоих архитектур.
Зачем и как это касается этого плагина?
Ответ: часто скрипами приходится получать какую-нибудь структуру редатктора, и читать оттуда что-то, или писать туда. Ну для этого нужно знать где именно в памяти лежит это поле. И не всегда сходу определишь(выравнивание + архитектура + вложенность структур). А так посмотрим на исходник, и вспомнили всё. И в случае изменений Инструктор на ходу сможет легко вносить правки смещений, а кто-то для себя каждый раз сбиваться заново.
Вот.
Posted: Fri Feb 04, 2011 8:21 am
by VladSh
Instructor
WScript.Echo() выводит в заголовке имя текущего скрипта..
Сделайте пожалуйста, чтобы при записи
Code: Select all
AkelPad.MessageBox(AkelPad.GetMainWnd(), "Text",, 0 /*MB_OK*/);
т.е. при неуказанном 3-м параметре было то же самое.
Posted: Fri Feb 04, 2011 8:39 am
by FeyFre
VladSh
ECMA262 не позволяет не указать промежуточный параметр. Это только VB позволяет такой финт(по сути там декларация с аргументом по-умолчанию) - финт языка.
Posted: Fri Feb 04, 2011 8:51 am
by VladSh
FeyFre
Тогда если пустоту передать, то чтобы выводилось имя текущего скрипта. Думаю, это возможно.
Posted: Fri Feb 04, 2011 10:17 am
by FeyFre
VladSh
Обычно если передают пустоту, то её и хотят увидеть. И даже если передают NULL(0) это значение аргумента тоже документировано в WINAPI.
Posted: Fri Feb 04, 2011 11:42 am
by VladSh
FeyFre
А undefined

Posted: Tue Feb 15, 2011 9:24 am
by FeyFre
Как господа скриптописатели смотрят на то, что-бы метод GetMainWnd() заменить на константу MAINWND?
По сути, возвращаемое GetMainWnd значение никогда не изменится во время жизни скрипта, более того оно постоянно в пределах работы самого АП. По сути это же значение такой же природы что и _TCHAR, _TSIZE, _TSTR.
Posted: Tue Feb 15, 2011 9:33 am
by VladSh
FeyFre wrote:Как господа скриптописатели смотрят на то, что-бы метод GetMainWnd() заменить на константу MAINWND?
Не принципиально.
Но чем меньше кнопать, тем лучше. Тогда WNDMAIN.
Posted: Tue Feb 15, 2011 10:46 am
by FeyFre
VladSh, не в кнопконажимательстве дело. AutoComplete и Templates сводят его к минимуму.
Posted: Tue Feb 15, 2011 1:51 pm
by VladSh
FeyFre, и чем меньше кода, тем лучше; я это тоже имел ввиду.
А вообще это ерунда. Т.е. не то, из-за чего копья ломать. Сильно жить не мешает, и ладно.
Posted: Tue Feb 15, 2011 6:05 pm
by Instructor
Добавлено: объект AkelPad.ScriptSettings() и его методы Begin, Read, Write, Delete, End.
Добавлено: метод WScript.ScriptBaseName.
Добавлено: поддержка вертикального выделения во второй параметр метода ReplaceSel.
Added: object AkelPad.ScriptSettings() and its methods Begin, Read, Write, Delete, End.
Added: method WScript.ScriptBaseName.
Added: column selection support for second parameter of ReplaceSel method.
Scripts plugin v8.0