![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
преобразование типов при подключении DLL [D6, WinXP]
_newver_ © (2004-09-14 09:18:00)Есть DLL, написанная на CB++, в которой некоторые функции возвращают свой тип (структуру) TBody. С вызовом таких функций проблем не возникло, но когда я в Дельфи создал точно такой же тип и попытался передать возвращаемое значение из импортированной функции в собственно созданную структуру, то он мне выдал ощибку: типа Invalid pointer operation. Что мне делать и как получить всё то что возвращает функция ???
Digitman (2004-09-14 12:25:00) [1]
> а именно??? указать на массив ???
да, именно - при передаче параметра такого типа передавать указатель на массив, причем существующиймассив строго определенного размера !
вызванному же коду остается только занести значения в элементы массива
DiamondShark (2004-09-14 12:21:00) [2]array of double -- вовсе даже не аналог *double.
Точно так же и с другими типами.
_newver_ (2004-09-14 12:15:00) [3]а именно??? указать на массив ??? Хорошо. А как правильно тогда ?
Digitman (2004-09-14 12:12:00) [4]
> что то я не то делаю ?
с чего ты взял, что библиотека в кач-ве параметра-массива ожидает именно динамический массив ?
_newver_ (2004-09-14 12:04:00) [5]Digitman
>> приведи соотв.декларации в Делфи ..
т.е. ??? Создать подобную структуру в дельфи? - сделал, заполнил все нужные поля и передал в функци (из длл). Функция тоже отработала, а вот её результат я получить не могу!!! Хотя вроде типы подогнал!
DiamondShark >>
...
type TBody = record
GranMas : array of double;
GranElemNum : integer;
PointMas : array of double;
InsideMas : array of double;//
InsideElemNum : integer;//
ForceMas : array of TVector;
ForceInsideMas : array of TVector;
NoVeMas : array of TVector;
DirectionX : TVector;
DirectionY : TVector;
Coordinates: TVector;
Omega : TVector;
Speed : TVector;
FlagCenterDeterminated : boolean;
end;
...
var
main_form: Tmain_form;
body1 :TBody ;
body2 :TBody ;
...
function _Physics(body : Tbody;
wind : TVector;
plotnost :double;
DeltaTime :double;
Gravity : TVector;
CenterForce : TVector) : TBody ; stdcall; external 'dll_mail.dll' ;
....
/////////////// вот далее Дельфи ругается - выдает ошибку
body2 := _Physics(body1, wind, plotnost, DeltaTime, Gravity,CenterForce)
Может что то я не то делаю ????
DiamondShark (2004-09-14 11:48:00) [6]Хм... В структуре куча полей указателей.
Кто должен выделять память под них при вызове функции, вызывающая сторона, или сама функция выделяет?
Digitman (2004-09-14 11:18:00) [7]приведи соотв.декларации в Делфи ..
_newver_ (2004-09-14 10:17:00) [8]может написать пару функций в сишнике, которые бы приобщали эту структуру к какому-нибудь более общему виду (для дельфи и си) и потом обратно (из общего в свой) ???
_newver_ (2004-09-14 10:14:00) [9]исходники есть. структура вот такого типа (С++)
struct TVector
{
double x,y,z;
};
struct TVectorPlace
{
double x1,y1,z1,x2,y2,z2;
};
typedef double *TMatr;
struct TBody
{
double *GranMas; //массив
double *PointMas;//массив
double *InsideMas;//массив
int InsideElemNum;//
TVector *ForceMas;//массив
TVector *ForceInsideMas;//массив
TVector *NoVeMas;//массив
TVector DirectionX;
TVector DirectionY;
TVector Coordinates;
TVector Omega;
TVector Speed;
bool FlagCenterDeterminated;
};
// функция которая получает структуру "боди", модернизирует её и возвращает в новом, модернизированном виде ...
extern "C" __declspec(dllexport) TBody BodyMod (TBody body)
{
...
}
Digitman (2004-09-14 09:40:00) [10]
> _newver_ (14.09.04 09:36) [3]
> а по проще есть какие-либо методы???
да куда уж проще ..
ты вот лучше скажи, библиотека эта - твоей разработки ?
декларация TBody как выглядит в C и Паскале ?
_newver_ (2004-09-14 09:36:00) [11]а по проще есть какие-либо методы???
KSergey (2004-09-14 09:32:00) [12]Ну и не плохо бы выть уверенным в одинаковом методе выравнивания полей, либо отсутствии оного (в смысле выравнивании на 1)
Digitman (2004-09-14 09:30:00) [13]либо передавай параметром адрес структуры, память под которую выделена в хост-приложении, по ссылке либо и в хост-приложении и в библиотеке используй единый менеджер памяти borlandmm.dll (см. справку, ключ.слово "ShareMem")