Форум: "Основная";
Текущий архив: 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