OberonCore https://forum.oberoncore.ru/ |
|
Проблема: Delphi <--> CP https://forum.oberoncore.ru/viewtopic.php?f=5&t=5520 |
Страница 2 из 2 |
Автор: | prospero78 [ Четверг, 15 Октябрь, 2015 22:17 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
В-общем, вижу я тут только два рабочих решения: 1) Сделать какой-нибудь прокси-DLL с впихнутыми формами; 2) сокеты на крайний случай. |
Автор: | Роман М. [ Четверг, 15 Октябрь, 2015 22:32 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
Alexander Shiryaev писал(а): Все массивы должны быть с флагом untagged (ARRAY ... OF → ARRAY [untagged] ... OF). Скорее всего надо заменить Time: ARRAY OF SHORTCHAR → VAR Time: ARRAY [untagged] OF SHORTCHAR (как в Delphi?) Лучше завести новый тип: Код: TYPE PAnsiChar = POINTER TO ARRAY [untagged] OF SHORTCHAR; PChar = PAnsiChar; (*...*) VAR Time: PChar (*...*) Alexander Shiryaev писал(а): Delphi Single → Component Pascal SHORTREAL Delphi Double → Component Pascal REAL Типа Delphi Real в Component Pascal нет Согласно документации на сайте Эмбаркадеро тип Real является синонимом типа Double. Не знаю, правда, с каких пор. |
Автор: | Роман М. [ Четверг, 15 Октябрь, 2015 22:49 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
prospero78 писал(а): В оригинале вместо char используется word. Всё нормально передастся если правильно определить типы.Я не уверен, что передача флагов будет работать верно. Цитата: Код: tStatusPoint* = RECORD [untagged] status*: SHORTINT; flags*: CHAR; END; tAnalogPoint* = RECORD [untagged] asFloat*: SHORTREAL; asCode*: SHORTINT; Flags*: CHAR; Units*: ARRAY 10 OF SHORTCHAR; END; Согласно соглашениям для разработчиков КП, поля записей и переменных нужно именовать начиная с строчных букв. flags имеет размер 16 бит - тогда тип SHORTINT, как упомянул Александр. Если бы был размер 32 бита, то тогда лучше тип SET. Для флагов самое оно в КП. prospero78 писал(а): Массивы там вообще никак не влияют, но за совет спасибо. Да, по ссылке. Но для описания интерфейса к сторонним средствам (коими являются DLL) нужно всегда указывать [untagged].У уже написал переходную DLL на Delphi и выяснил, что DLL сама не принимает из оригинальной DLL значение. Хотя оконное приложение прекрасно получает эти значения. Код: VAR Time: ARRAY OF SHORTCHAR <-- разве это не будет обращение по ссылке?Скорее всего где-то намудрено с типами и с тем кто занимается резервированием и освобождением памяти. |
Автор: | Alexander Shiryaev [ Четверг, 15 Октябрь, 2015 23:56 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
Роман М. писал(а): Код: TYPE PAnsiChar = POINTER TO ARRAY [untagged] OF SHORTCHAR; POINTER [untagged] TO ARRAY [untagged] OF SHORTCHAR Роман М. писал(а): Код: (*...*) VAR Time: PChar (*...*) VAR тогда не нужен |
Автор: | prospero78 [ Пятница, 16 Октябрь, 2015 08:00 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
Пока еду на работу. Вчера уже выяснил: DLL на том же Delphi 6 (без окошек) принимает в качестве ответа "0", приложение созданное с нуля (с окошком) на там же Delphi 6 исправно получает ответы и от tmAnalog и от tmAnalogFull. Так что это не мудрённости типов между DLL и Component Pascal, это странности работы WinApi при работе с вещественными числами. Я вчера упомянул про сокеты -- не помогут. Безокошечная прокси-DLL сама не получает результат из первой библиотеки. Кстати, библиотека кривая. По факту функция tmAnalog не описана в заголовочном файле как положено (закомментирован export stdcall '_tmAnalog@24', на самом деле экспортирована как '_tmAnalog@20', и судя по описанию -- так на самом деле и есть). Результат почти всех функций возвращается как SmallInt и сравнивается с unsigned integer константой, на что компилятор вываливает кучу варнингов. Для промышленного кода, по моему, недопустимый случай. |
Автор: | prospero78 [ Пятница, 16 Октябрь, 2015 09:54 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
Впихнул я в DLL форму. И о чудо! Прекрасно передаётся и INTEGER, и REAL, и подозреваю, всё прекрасно передаётся))) Правда теперь к побеждению предстоит другой косяк: автоматически вылазит окно, и пока не разрушится -- назад результат не возвращает. А при закрытии падаёт всё))) АДД. Частично косяк побеждён. Просто не запускаю в прокси-DLL Application.Run + перед ним делаю frmMain.Hide(). |
Автор: | prospero78 [ Пятница, 16 Октябрь, 2015 11:38 ] |
Заголовок сообщения: | Re: Проблема: Delphi <--> CP |
ТЕМА ЗАКРЫТА В прокси-DLL я не позволяю запускаться Application.Run (+ добавлен формальный модуль modFrmMain, в котором описана сама форма; скрывается при создании экземпляра приложения). Возврат REAL и INTEGER происходят прекрасно. Так что, плюшке для сервера телемеханники на Компонетном Паскале -- БЫТЬ! ))) Возможно, прокси-DLL перепишу на FreePascal\Lazarus. Лицензионная чистота, всё-таки, -- важна. Всем спасибо за участие) |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |