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

Вниз

преобразование типов при подключении DLL   Найти похожие ветки 

 
_newver_   (2004-09-14 09:18) [0]

Есть DLL, написанная на CB++, в которой некоторые функции возвращают свой тип (структуру) TBody. С вызовом таких функций проблем не возникло, но когда я в Дельфи создал точно такой же тип и попытался передать возвращаемое значение из импортированной функции в собственно созданную структуру, то он мне выдал ощибку: типа Invalid pointer operation. Что мне делать и как получить всё то что возвращает функция ???


 
Digitman ©   (2004-09-14 09:30) [1]

либо передавай параметром адрес структуры, память под которую выделена в хост-приложении, по ссылке либо и в хост-приложении и в библиотеке используй единый менеджер памяти borlandmm.dll (см. справку, ключ.слово "ShareMem")


 
KSergey ©   (2004-09-14 09:32) [2]

Ну и не плохо бы выть уверенным в одинаковом методе выравнивания полей, либо отсутствии оного (в смысле выравнивании на 1)


 
_newver_   (2004-09-14 09:36) [3]

а по проще есть какие-либо методы???


 
Digitman ©   (2004-09-14 09:40) [4]


> _newver_   (14.09.04 09:36) [3]
> а по проще есть какие-либо методы???


да куда уж проще ..

ты вот лучше скажи, библиотека эта - твоей разработки ?
декларация TBody как выглядит в C и Паскале ?


 
_newver_   (2004-09-14 10:14) [5]

исходники есть. структура вот такого типа (С++)

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)
{
...
}


 
_newver_   (2004-09-14 10:17) [6]

может написать пару функций в сишнике, которые бы приобщали эту структуру к какому-нибудь более общему виду (для дельфи и си) и потом обратно (из общего в свой) ???


 
Digitman ©   (2004-09-14 11:18) [7]

приведи соотв.декларации в Делфи ..


 
DiamondShark ©   (2004-09-14 11:48) [8]

Хм... В структуре куча полей указателей.
Кто должен выделять память под них при вызове функции, вызывающая сторона, или сама функция выделяет?


 
_newver_   (2004-09-14 12:04) [9]

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)

Может что то я не то делаю ????


 
Digitman ©   (2004-09-14 12:12) [10]


> что то я не то делаю ?


с чего ты взял, что библиотека в кач-ве параметра-массива ожидает именно динамический массив ?


 
_newver_   (2004-09-14 12:15) [11]

а именно??? указать на массив ??? Хорошо. А как правильно тогда ?


 
DiamondShark ©   (2004-09-14 12:21) [12]

array of double -- вовсе даже не аналог *double.
Точно так же и с другими типами.


 
Digitman ©   (2004-09-14 12:25) [13]


> а именно??? указать на массив ???


да, именно - при передаче параметра такого типа передавать указатель на массив, причем существующий массив строго определенного размера !

вызванному же коду остается только занести значения в элементы массива



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

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

Наверх




Память: 0.5 MB
Время: 0.029 c
11-1080481100
zoom
2004-03-28 17:38
2004.09.26
Как сохранить из editbox в файл через диалог


14-1094173306
Mutilator
2004-09-03 05:01
2004.09.26
Оплачиваемая работа - ищу программиста


1-1094640944
Толик
2004-09-08 14:55
2004.09.26
Как сделать загрузку из файла типа ini в TMemo


3-1093872229
Relaxxx
2004-08-30 17:23
2004.09.26
Не могу толком записать в блоб поле картинку в оракл через ODAC


1-1093771437
Matrex
2004-08-29 13:23
2004.09.26
Как запретить выделение текста в WebBrowser?