OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 05 Декабрь, 2019 20:41

Часовой пояс: UTC + 3 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 27 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Четверг, 15 Октябрь, 2015 22:17 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
В-общем, вижу я тут только два рабочих решения:
1) Сделать какой-нибудь прокси-DLL с впихнутыми формами;
2) сокеты на крайний случай.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Четверг, 15 Октябрь, 2015 22:32 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
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. Не знаю, правда, с каких пор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Четверг, 15 Октябрь, 2015 22:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
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].
Скорее всего где-то намудрено с типами и с тем кто занимается резервированием и освобождением памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Четверг, 15 Октябрь, 2015 23:56 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 458
Откуда: Егорьевск
Роман М. писал(а):
Код:
TYPE
  PAnsiChar = POINTER TO ARRAY [untagged] OF SHORTCHAR;

POINTER [untagged] TO ARRAY [untagged] OF SHORTCHAR

Роман М. писал(а):
Код:
(*...*) VAR Time: PChar (*...*)

VAR тогда не нужен


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Пятница, 16 Октябрь, 2015 08:00 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
Пока еду на работу. Вчера уже выяснил: DLL на том же Delphi 6 (без окошек) принимает в качестве ответа "0", приложение созданное с нуля (с окошком) на там же Delphi 6 исправно получает ответы и от tmAnalog и от tmAnalogFull. Так что это не мудрённости типов между DLL и Component Pascal, это странности работы WinApi при работе с вещественными числами. Я вчера упомянул про сокеты -- не помогут. Безокошечная прокси-DLL сама не получает результат из первой библиотеки.

Кстати, библиотека кривая. По факту функция tmAnalog не описана в заголовочном файле как положено (закомментирован export stdcall '_tmAnalog@24', на самом деле экспортирована как '_tmAnalog@20', и судя по описанию -- так на самом деле и есть).
Результат почти всех функций возвращается как SmallInt и сравнивается с unsigned integer константой, на что компилятор вываливает кучу варнингов.

Для промышленного кода, по моему, недопустимый случай.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Пятница, 16 Октябрь, 2015 09:54 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
Впихнул я в DLL форму. И о чудо!
Прекрасно передаётся и INTEGER, и REAL, и подозреваю, всё прекрасно передаётся)))

Правда теперь к побеждению предстоит другой косяк: автоматически вылазит окно, и пока не разрушится -- назад результат не возвращает.
А при закрытии падаёт всё)))

АДД. Частично косяк побеждён. Просто не запускаю в прокси-DLL Application.Run + перед ним делаю frmMain.Hide().


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема: Delphi <--> CP
СообщениеДобавлено: Пятница, 16 Октябрь, 2015 11:38 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
ТЕМА ЗАКРЫТА

В прокси-DLL я не позволяю запускаться Application.Run (+ добавлен формальный модуль modFrmMain, в котором описана сама форма; скрывается при создании экземпляра приложения).
Возврат REAL и INTEGER происходят прекрасно. Так что, плюшке для сервера телемеханники на Компонетном Паскале -- БЫТЬ! )))

Возможно, прокси-DLL перепишу на FreePascal\Lazarus. Лицензионная чистота, всё-таки, -- важна.

Всем спасибо за участие)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB