sciter 1 и Delphi
От: alex1nax  
Дата: 02.03.14 17:58
Оценка:
Пытаюсь написать обертку sciter-x.dll для Delphi.
Сейчас столкнулся с проблемой регистрации native классов.

Создаю компонент. В конструкторе получаю Handle окна.

Затем вызываю
FSciterVM := SciterGetVM(Handle);

Затем цепляю callback и EventHandler.

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

procedure TSciterX.Init;
var
  ma: array[0..1] of tiscript_method_def;
  cd: tiscript_class_def;
begin

  ma[0].name:=pansichar('test');
  ma[0].handler:=@TestNativeMethod;
  ma[1].name:=pansichar('this');
  ma[1].handler:=@thisNativeMethod;

  cd.name:=classini;
  cd.methods:=@ma;
  cd.props:=0;
  cd.consts:=0;
  cd.prototype:=0;
  cd.finalizer:=finalize;
  cd.get_item:=nil;
  cd.set_item:=nil;
  cd.iterator:=nil;
  cd.on_gc_copy:=gc_copy;

  ni.define_class(FSciterVM, @cd, 0);

end;


Если в методе Init вызвать метод native интерфейса eval

script:='var i = new ini(); i.test();';
ni.eval_string(FSciterVM,ni.get_current_ns(FSciterVM),pchar(script),length(script),@v)


функции TestNativeMethod и thisNativeMethod чудесно вызываются.

Проблема состоит в следующем: если после проделанных манипуляций я загружаю в sciter документ, то получаю

Project SciterTest.exe raised exception class $C0000005 with message 'access violation at 0x10001dcd: read of address 0x00000008'.

Без регистрации класса документ, естественно, загружается без ошибок.
В чем может быть проблема?
Re: sciter 1 и Delphi
От: baranovda Российская Империя  
Дата: 02.03.14 18:12
Оценка:
Здравствуйте, alex1nax, Вы писали:

A>Пытаюсь написать обертку sciter-x.dll для Delphi.

Извиняюсь, что не совсем по теме, но код просто кишит потенциальными проблемами из-за юникода, бинарной переносимости машинного кода С++/Delphi, специфики менеджера памяти Pascal, специфики VCL т.д. Это очень тягомотно отлавливать, поэтому имхо гораздо лучше наладить взаимодействие между Sciter и Delphi через COM/ATL.

A>В чем может быть проблема?

Во всем вышеперечисленном Берите студию, настраивайте ее на отладку проекта в Delphi IDE и ловите.
Re[2]: sciter 1 и Delphi
От: alex1nax  
Дата: 03.03.14 18:52
Оценка:
Здравствуйте, baranovda, Вы писали:

Извиняюсь, что не совсем по теме, но код просто кишит потенциальными проблемами из-за юникода, бинарной переносимости машинного кода С++/Delphi, специфики менеджера памяти Pascal, специфики VCL т.д.


Спасибо за ответ. И вполне, может быть, по теме. Только бы чуть больше конкретики, на что именно нужно обратить внимание в моем коде по перечисленным вами пунктам? С C++ опыта нет, поэтому любые советы будут очень кстати.
А ActiveX'ом первого Sciter'а как раз пользовался. Там, насколько я успел его "узнать", обеспечено минимально необходимое взаимодействие и его, в принципе, достаточно. Но, как говорится, однажды что-то стукнуло в голову — захотелось большего и пока не отпускает. Может, это извращение, но все-таки...

И, как-то, все-таки, странно... По отдельности-то все работает...
Re[3]: sciter 1 и Delphi
От: baranovda Российская Империя  
Дата: 03.03.14 19:13
Оценка: 2 (1)
Здравствуйте, alex1nax, Вы писали:

A>Спасибо за ответ. И вполне, может быть, по теме. Только бы чуть больше конкретики, на что именно нужно обратить внимание в моем коде по перечисленным вами пунктам? С C++ опыта нет, поэтому любые советы будут очень кстати.


По памяти:
1. На С++ автоматом выполняются преобразования между HELEMENT — dom::element. Как реализовать нормальный dom или эмуляцию композитных классов со множественным наследованием (например одновременно behavior и event_handler) на Delphi я не представляю
2. На С++ Андрей написал удобные функции преобразования tiscript::value — VARIANT
3. В С++ Более прозрачная работа с unicode (нормальная поддержка UTF-8 в Delphi емнип появилась только в Delphi XE). У меня D7, и я в паре мест наталкивался на некорректную работу функций UTF8Decode/UTF8Encode (при преобразовании отрезалась часть конвертируемой строки).
4. В VCL иногда (не помню уже почему) нельзя было создавать окно Sciter в конструкторе формы, т.к. вылетала известная ошибка Control ... has no parent window.
5. Неявное преобразование VARIANT-WideString-String в Delphi работает очень неочевидно, нужно очень хорошо понимать, что делается внутри, быть начеку и постоянно смотреть, что генерирует компилятор.
Это по памяти. Часть этих проблем решается довольно просто допиливанием AxSciter.
Re: sciter 1 и Delphi
От: flаt  
Дата: 04.03.14 06:35
Оценка:
Здравствуйте, alex1nax, Вы писали:

A>Пытаюсь написать обертку sciter-x.dll для Delphi.

Думаю, стоит посмотреть на существующие, т.к. слишком много ошибок в вашем коде.
Re[2]: sciter 1 и Delphi
От: keksov  
Дата: 04.03.14 10:56
Оценка:
Здравствуйте, flаt, Вы писали:
F>Думаю, стоит посмотреть на существующие, т.к. слишком много ошибок в вашем коде.

Поделитесь пожалуйста ссылками, если можно, то не на "концепты".
А то я тут для Htmlayout свою обертку допилил (даже SVG движок свой прикрутил), думаю заняться Sciter вплотную, а, вдруг, уже кто-то написал...
Re[2]: sciter 1 и Delphi
От: alex1nax  
Дата: 04.03.14 11:20
Оценка:
Здравствуйте, flаt, Вы писали:

Думаю, стоит посмотреть на существующие, т.к. слишком много ошибок в вашем коде.


Да-да, ссылки на "посмотреть" были бы кстати. Я, например, кроме этого ничего не нашел.
И по-поводу "много ошибок" — что именно вы имеете ввиду. Хотелось бы указания хотя бы на пару мест в моем коде.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.