Главная страница
    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.47 MB
Время: 0.032 c
11-1080814755
nester
2004-04-01 14:19
2004.09.26
Почему глючит showmodal в Thread?


1-1095083230
sloug
2004-09-13 17:47
2004.09.26
Цвет текста в TDBMemo


1-1094657252
maksim
2004-09-08 19:27
2004.09.26
Распечатка отчетов


14-1094231085
Кирилл
2004-09-03 21:04
2004.09.26
Смертная казнь


14-1094801301
Kray
2004-09-10 11:28
2004.09.26
Установка своего компонента





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский