Quantcast

(no subject)

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

(no subject)

Мохов Геннадий
Здравствуйте, Андрей.

Мне удалось разобраться с вызовами внешних функций из SPF. Связка SPF 4.20 + Qt заработала нормально.
Пример:
      для Windows http://narod.ru/disk/2286247001/spfqt_win.zip.html
      для Linux       http://narod.ru/disk/2215519001/console_SPFQT.zip.html

Однако встретилась проблема. Как я понял при вызове из C++ функции в SPF  (callback) содержимое регистра EBP
не сохраняется (в Linux точно, в Win не проверял, просто изменил код, см ниже). Из-за этого пришлось изменить алгоритм работы с Qt.
SPF вызывает функцию (см ниже), инициализирует Qt и тут же вызывает callback для дальнейшей работы, а в C++ ввести след. конструкцию (после чего всё заработало нормально):

Пример:
extern "C" FQT_API  int QT_AppD(int qargc, char *qargv[], void *adrf) {
        sav = (void *)new QApplication(qargc, qargv);
        __asm__("push %ebp");           // Сохраняю, т.к. без этого не запускается ((QApplication *)sav)->exec();
        __asm__("push %eax");           //  <-- суть не понимаю. Просто без этого не работает. Подобрал опытным путем
        ((ExecZIM_1_0)adrf)((void *)sav); // Вызов callback SPF, (где происходит собственно работа SPF с Qt
        __asm__("pop %eax");
        __asm__("pop %ebp");
        ((QApplication *)sav)->exec();
  return  0;
}

Вопрос: Есть ли в SPF штатные средства  включения механизма сохранения EBP при внешнем вызове.
Если есть - как включить, если нет - как добавить?
Или это сделано специально, например для ускорения работы?

Мохов Геннадий

------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: CALLBACK

Andrey Cherezov
28.12.2010 18:50, Мохов Геннадий пишет:
> Мне удалось разобраться с вызовами внешних функций из SPF. Связка SPF 4.20 + Qt заработала нормально.
> Пример:
>        для Windows http://narod.ru/disk/2286247001/spfqt_win.zip.html
>        для Linux       http://narod.ru/disk/2215519001/console_SPFQT.zip.html
Наши поздравления! Упорство вознаграждается! :)
> Вопрос: Есть ли в SPF штатные средства  включения механизма сохранения EBP при внешнем вызове.
> Если есть - как включить, если нет - как добавить?
> Или это сделано специально, например для ускорения работы?
Друг друга SPFные функции вызывают без сохранения EBP. Точнее, с его
контролируемым изменением - это ведь у нас указатель стека.
Да и другие регистры портим активно. Для вызова функции SPF из сишного
кода функцию надо "объявить" через CALLBACK:., тогда все регистры
вызывающего будут сохранены/восстановлены.
См. например ~ac/lib/lin/xml/expat.f , с libexpat вся работа через
callback'и.


------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: (без темы)

Andrey Cherezov
In reply to this post by Мохов Геннадий
Re: (без темы)

> : PAS-EXEC ( ... n dll-xt -- x )

Ну, раз вняли моему совету и воспользовались ~ac/lib/ns/ns.f , то лучше эту вырезку предварить соответствующей ссылкой на источник. Если бы использовали также so-xt и dll-xt, то пример получился бы вдвое короче, imho ;)

И все предварительные страхи насчет вызова методов классов, выходит, оказались беспочвенными - вызовы обычные сишные, т.е. совершенно типичная обертка для dll/so получилась. Или эти особые вызовы отложены на будущее?

 


-------- Исходное сообщение --------
Тема: (без темы)
Дата: 2010-12-28 19:51:03
От: [hidden email]

Здравствуйте, Андрей.

Мне удалось разобраться с вызовами внешних функций из SPF. Связка SPF 4.20 + Qt заработала нормально.


------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: (без темы)

Andrey Cherezov
In reply to this post by Мохов Геннадий
Re: (без темы)

А, виноват, не доглядел. Вся сложность плюсплюса Qt упрятана в fqt.dll? Тогда это не назвать "удалось разобраться", это скорее "удалось всё усложнить" - вызов из самодельной dll уж точно не надо было оборачивать спецсредствами типа _-Call", штатные готовые средства должны были сработать нормально. Это всё переписывание велосипеда ради единственного Extern" NameCodec" ? Тогда проще было бы в этой fqt соответственно возвращать адрес.

> Странно, но я так и делал. Без вставки ассм кода сохранения регистров в С++ (см пример в пред письме) происходит разрушение программы на след вызове после возвращения из callback в С++.

Тем не менее, callback регистры сохраняет, в т.ч. и EBP в первую очередь, см. CODE _WNDPROC-CODE. Добавление дополнительной стековой манипуляции перед вызовом могло помочь по другой причине. В том же _WNDPROC-CODE обратите внимание на хак "SUB  ESP, # 3968". У нас стек данных форта резервируется на системном стеке, а запуск самого процесса (и доп. форт-потоков, if any) начинался с того же WNDPROC-CODE, соответственно при вызове CALLBACK'ов получается эдакая матрешка с риском пересечения стеков. И это случалось при разработке SPF... Число 3968 было просто экспериментально подобрано, чтобы минимизировать этот риск. Но исключить его совсем можно только отделением стека данных от стека возвратов. В dsForth я так и делал, еще в прошлом веке, а до SPF тогда руки не дошли. Так эта мина и живет. Вот видимо приплюснутый код глубже использует стек, и фортовый callback просто часть его затирает... А ваш ассм код сдвигает вершину так, что до критических данных стиратель не дотягивается :)

> Для меня сейчас главное единые библиотеки для Win и Linux и единый код в форте, а то в одном месте WINAPI: в другом USE: - голова кругом от разнообразия. Главное для меня добиться максимальной совместимости кода форта для разных платформ.
Вот-вот, и у меня тоже голова была кругом, поэтому указанные либы я и разработал, избавился и от WINAPI, и от USE. 200 строк вашего кода можно заменить на две
ALSO SO NEW: fqt.so.2.0.0
ALSO DLL NEW: fqt.dll
Миллион примеров "максимальной совместимости кода форта для разных платформ" (общего кода для двух платформ - в основном как раз подобных оболочек для внешних dll/so) см. в ~ac/lib/lin.
(Если их там не миллион, то CVS UPDATE приблизит к этому числу :)
> По большому счету бы интересно смоделировать работу C++ из SPF. Например создать объект из C++ и в SPF сделать наследование этогообъекта с добавлением собственных методов и данных.
Для виндового DCOM/ActiveX мы такое взаимопонимание Форта и внешних классов давно сделали. Наверняка и для приплюснутых объектов можно что-то изобрести. Сильный стимул нужен, чтоб решиться углубиться :) Qt на него не тянет никак.

-------- Исходное сообщение --------
Тема: (без темы)
Дата: 2010-12-28 19:51:03
От: [hidden email]

Здравствуйте, Андрей.

Мне удалось разобраться с вызовами внешних функций из SPF.


------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Loading...