Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Как сделать систему 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.04 c
15-1158509360
dreamse
2006-09-17 20:09
2006.10.08
За какое время сможете найти ответ в приколе ?


15-1158468615
Чапаев
2006-09-17 08:50
2006.10.08
Как узнать путь к shell application?


15-1158667458
dgim
2006-09-19 16:04
2006.10.08
Файлы....


2-1158666204
BFG9k
2006-09-19 15:43
2006.10.08
Чтение файла в строку


9-1137021348
Buffer
2006-01-12 02:15
2006.10.08
GLScene Buffer Как узнать видна ли такая то точка или нет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский