Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать систему dll-плагинов работающих на Си и Дельфи ? [D7]


Страницы:   1 2

Not ©   (2006-09-17 02:15:00) 

одновременно.

Есть следующие данные которые надо передавать в DLL там отредактировать и вернуть обратно:


type
TVector3f = array [0..2] of Single;

      TFGTData = record
        PTInd  : array [0..2] of Integer;
        TXInd  : array [0..2] of Integer;
        Enable : Boolean;
        NRData : Integer;
      end;

    TFData = record
      FGTData      : array of TFGTData;
      Name         : string;
      MName        : string;
      Visible      : Boolean;
      NTData       : Byte;
    end;

  TFDatas = array of TFData;

  TTXData = record
    X, Y    : Single;
    Enabled : Boolean;
  end;

  TPData = record
    ITData  : TVector3f;
    Enabled : Boolean;
    BNData  : SmallInt;
  end;

TMData = record
  Name     : string;
  PData    : array of TPData;
  TXData   : array of TTXData;
  FData    : TFDatas;
  Visible  : Boolean;
end;

TMDatas = array of TMData;

var
MDatas1 : TMDatas;


Передать нужно данные из MDatas1. Само собой их можно как нибудь преобразовать упаковать, и т. д. Например я мог бы упаковать их в TStream. Но в Си их нету. А что есть, или как тогда быть?

Можно какой-нибудь пример как такие задачи решаются?

Речь идёт не о единичном рекорде без строк и динамических массивов, а именно о такой большой конструкции.


Not   (2006-09-20 07:26:00) [1]


> Slym(RO)   (18.09.06 05:05) [21]
>
> 1. напиши DLL - с объявлением типов, и процедур работы с
> ними, можно COM
> 2. Все типы уравниваются до pointer, а уж там разбирайся
> что внутри, а для этого есть 1 пункт.
> 3. Пиши что угодна на каком угодно языке используя 1 пункт.
>
> и будет тебе счастье
>
> приведи элементарные процедуры с типами...

А можно пример как это делается? Лучше без COM.


> Сергей М. ©   (18.09.06 08:17) [22]
>
>
> > я мог бы упаковать их в TStream. Но в Си их нету
>
>
> Зато есть интерфейс IStream. Он и в Паскале, и в Си, и в
> Африке IStream

А можно пример как это делается?


> guav ©   (17.09.06 13:38) [7]
>
> > Есть следующие данные которые надо передавать в DLL там
> > отредактировать и вернуть обратно
>
> Понимается ли под редактированием добавление/удаление записей,
>  или только изменение полей ?

В смысле изменение размерности массивов? Да подразумевается.


Сергей М.   (2006-09-18 08:17:00) [2]


> я мог бы упаковать их в TStream. Но в Си их нету


Зато есть интерфейс IStream. Он и в Паскале, и в Си, и в Африке IStream


Slym(RO)   (2006-09-18 05:05:00) [3]

1. напиши DLL - с объявлением типов, и процедур работы с ними, можно COM
2. Все типы уравниваются до pointer, а уж там разбирайся что внутри, а для этого есть 1 пункт.
3. Пиши что угодна на каком угодно языке используя 1 пункт.
и будет тебе счастье

приведи элементарные процедуры с типами...


Anatoly Podgoretsky   (2006-09-18 00:34:00) [4]

zamtmn ©   (18.09.06 00:01) [18]
А откуда сведенья, что на СИ
Если серьезно, то разные языки использованы, но в основном С++ и ассемблер.

А насчет вызова и ничего, как хочешь так и ешь. Первая версия Виндоус была на Паскале, вот от туда и это соглашение об вызове.


zamtmn   (2006-09-18 00:02:00) [5]

>>А вот немного ранее стандартом был вызов Pascal - по крайней мере в 16 битной версии.
и что?


zamtmn   (2006-09-18 00:01:00) [6]

>>На С++
откуда такие сведенья?
com может быть, но низкоуровневая часть - на С, следов ++ там не видно


Anatoly Podgoretsky   (2006-09-17 23:45:00) [7]

А вот немного ранее стандартом был вызов Pascal - по крайней мере в 16 битной версии.


Anatoly Podgoretsky   (2006-09-17 23:44:00) [8]

На С++


zamtmn   (2006-09-17 22:37:00) [9]

Anatoly Podgoretsky
на чем windows написан? точно, на C, а откуда там stdcall взялся?
>>В СИ изначально был cdecl
смотря что понимать под "изначально"


Anatoly Podgoretsky   (2006-09-17 22:07:00) [10]

На самом деле это вообще не относится и к СИ, поскольку требуется использовать только простые типы, в СИ только они и есть, но это может быть любой язык, например Паскаль, Фортрат, Пролог и т.д. Откуда там сложные языкозависимые типы, к тому же не фундаментальные, классы С++.
Приведенная структура совместима только с Дельфи, ни с СИ, ни С++, ни с другими языками несовместима, кроме двух указаных типов.


Anatoly Podgoretsky   (2006-09-17 21:58:00) [11]

zamtmn ©   (17.09.06 21:20) [12]
А чего ты windows.pas приравниваешь к СИ
Во времена создания СИ не было никакого stdcall, он появился только в С++ и то для связи с ОС.
В СИ изначально был cdecl


zamtmn   (2006-09-17 21:20:00) [12]

То что stdcall применен в windows.pas практически ко всем функциям, а win на C написан... и всё совместимо.
>>Так если СИ то другого не остается, поскольку stdcall не совместим с СИ
а где мы это видим?


Anatoly Podgoretsky   (2006-09-17 19:26:00) [13]

И что мы там видим?


zamtmn   (2006-09-17 18:37:00) [14]

>>поскольку stdcall не совместим с СИ
? непонял вас.
открываем windows.pas  и смотрим


Anatoly Podgoretsky   (2006-09-17 14:03:00) [15]

Desdechado ©   (17.09.06 12:36) [6]
Так если СИ то другого не остается, поскольку stdcall не совместим с СИ


Anatoly Podgoretsky   (2006-09-17 14:02:00) [16]

Придется тебе ограничиваться плагинами только на Дельфи, поскольку с СИ полностью не совместимо.

Правило написания библиотек - ничего языкозависимого, только простые фундаментальные типы. Таких в структурах только два Byte и Single, остальные только условно совместимые или полностью не совместимые.


guav   (2006-09-17 13:38:00) [17]

> Есть следующие данные которые надо передавать в DLL там
> отредактировать и вернуть обратно

Понимается ли под редактированием добавление/удаление записей, или только изменение полей ?
Динамиеские массивы можно заменить на пары количество-указатель на первый или сделать из записей-элементов однсвязные списки.


Desdechado   (2006-09-17 12:36:00) [18]

и не забудь соглашения о вызовах
cdecl, например


zamtmn   (2006-09-17 12:18:00) [19]

в заголовке ты упоминаешь C? тогда string замени на pchar, динамические массивы на просто массивы, record на packed record


Zeqfreed   (2006-09-17 12:16:00) [20]

С  такой массивной записью работать будет крайне неудобно. Советую изменить архитектуру и разбить обработку этих данных на несколько логических кусков.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо