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", другой раз - "Flags".
Согласно соглашениям для разработчиков КП, поля записей и переменных нужно именовать начиная с строчных букв.
flags имеет размер 16 бит - тогда тип SHORTINT, как упомянул Александр.
Если бы был размер 32 бита, то тогда лучше тип SET. Для флагов самое оно в КП.

prospero78 писал(а):
Массивы там вообще никак не влияют, но за совет спасибо.

У уже написал переходную DLL на Delphi и выяснил, что DLL сама не принимает из оригинальной DLL значение.
Хотя оконное приложение прекрасно получает эти значения.

Код:
VAR Time: ARRAY OF SHORTCHAR
<-- разве это не будет обращение по ссылке?
Да, по ссылке. Но для описания интерфейса к сторонним средствам (коими являются DLL) нужно всегда указывать [untagged].
Скорее всего где-то намудрено с типами и с тем кто занимается резервированием и освобождением памяти.

Автор:  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/