Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

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

 
Not   (2006-09-17 02:15) [0]

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

Есть следующие данные которые надо передавать в 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. Но в Си их нету. А что есть, или как тогда быть?

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

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


 
Германн ©   (2006-09-17 03:34) [1]


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

Т.е. речь идёт именно о "такой большой конструкции", но "со строками и динамическими массивами"? :-)


 
Zeqfreed ©   (2006-09-17 06:07) [2]

Собственно способ был озвучен: использовать динамическое выделение памяти и передавать указатели. Я боюсь, что писать код тебе придется самому. Мне очень лениво это делать для такой большой монструозной структуры записей :) Уверен, что там ничего упростить нельзя?


 
Not   (2006-09-17 07:29) [3]


> Zeqfreed ©   (17.09.06 06:07) [2]
>
> Собственно способ был озвучен: использовать динамическое
> выделение памяти и передавать указатели. Я боюсь, что писать
> код тебе придется самому. Мне очень лениво это делать для
> такой большой монструозной структуры записей :) Уверен,
> что там ничего упростить нельзя?

Не нельзя. При работе с ней ничего в общем то сложного нет. Я просто не понимаю как именно передать. Указатель, на массив указателей, на указатель, на массив указателей? Да ещё просто данные в перемешку. В общем непонятно как-то.


 
Zeqfreed ©   (2006-09-17 12:16) [4]

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


 
zamtmn ©   (2006-09-17 12:18) [5]

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


 
Desdechado ©   (2006-09-17 12:36) [6]

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


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

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

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


 
Anatoly Podgoretsky ©   (2006-09-17 14:02) [8]

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

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


 
Anatoly Podgoretsky ©   (2006-09-17 14:03) [9]

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


 
zamtmn ©   (2006-09-17 18:37) [10]

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


 
Anatoly Podgoretsky ©   (2006-09-17 19:26) [11]

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


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

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


 
Anatoly Podgoretsky ©   (2006-09-17 21:58) [13]

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


 
Anatoly Podgoretsky ©   (2006-09-17 22:07) [14]

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


 
zamtmn ©   (2006-09-17 22:37) [15]

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


 
Anatoly Podgoretsky ©   (2006-09-17 23:44) [16]

На С++


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

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


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

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


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

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


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

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

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


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

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

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


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


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


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


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


> 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 там
> > отредактировать и вернуть обратно
>
> Понимается ли под редактированием добавление/удаление записей,
>  или только изменение полей ?

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.08;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1158574514
MikhailV
2006-09-18 14:15
2006.10.08
Оцените код $-))


15-1158259297
Владимир_мпп
2006-09-14 22:41
2006.10.08
MS Excel


15-1158332236
Deqww
2006-09-15 18:57
2006.10.08
Рекурсия - непонятная штука!


15-1158247965
SamProf
2006-09-14 19:32
2006.10.08
Подскажите пожайлеста компонент


1-1156409591
DelphiLexx
2006-08-24 12:53
2006.10.08
FormStyle=fsMdiChild и FormStyle=fsNormal отрисовыв. по разному?