![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать систему dll-плагинов работающих на Си и Дельфи ? [D7]
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]С такой массивной записью работать будет крайне неудобно. Советую изменить архитектуру и разбить обработку этих данных на несколько логических кусков.