Текущий архив: 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.51 MB
Время: 0.071 c