Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

преобразование типов при подключении 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.034 c
1-1094735404
Still Swamp
2004-09-09 17:10
2004.09.26
RTF -> HTML и обратно.


14-1094619189
syte_ser78
2004-09-08 08:53
2004.09.26
ДОЖДАЛСЯ!!!!


1-1094647092
hgd
2004-09-08 16:38
2004.09.26
Время процедуры


3-1093695220
and
2004-08-28 16:13
2004.09.26
Список изменений при Cached Updates


3-1093420285
andrey__
2004-08-25 11:51
2004.09.26
TADOQuery редактир. уже изменённой записи!





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