Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать динамическую структуру из DLL в программу?


WondeRu ©   (2005-06-10 16:06:00) 

Здравствуйте, уважаемые!
Столнкулся с необъяснимым пытаюсь передавать из DLL в программу динамическую структуру TPOLYLINE:

  TPOLYLINE= record
   Items: array of T3Dposition;
   Count: Integer;
   Closed: Boolean;
   Color : Integer;
   Visible : Boolean;
 end;

 T3Dposition = record
   X, Y, Z : Double;
 end;


но при попытке передачи по указателю выдается эксепшен: 'Неверная операция с указателем'

Как избежать подобных ошибок, на что следует обратить внимание?
Как правильно осуществить передачу динамической структуры между DLL  и приложением?


Sapersky   (2005-06-12 00:14:00) [1]

Понятно.
Форма PSomeType(SomePtr)^ мне кажется более логичной, опять же, при обращении к полям ^ не обязательно, но это уже дело вкуса :)

2WondeRu:
Относительно фрагмента с ZeroMemory в [16] - извиняюсь, не заметил, что переменная там другая (ADxf_PolyLine). Но к чему тогда приведено это ZeroMemory...


VMcL   (2005-06-11 22:15:00) [2]

>> Sapersky   (11.06.05 19:12) [16]

TSomeType(SomePtr^)
это тоже самое, что
PSomeType(SomePtr)^

Где
PSomeType = ^TSomeType;
и
SomePtr: Pointer


Shuric   (2005-06-11 19:51:00) [3]

Реализуй из структуры интерфейс и не парся :)


Dimaxx   (2005-06-11 19:48:00) [4]

POLYLINE(AObject^).Count - это правильно.

AObject - это указатель (pointer). Чтобы добраться до содержимого и используется ^.


Sapersky   (2005-06-11 19:12:00) [5]

var
APolyLine: TPOLYLINE;
begin
try
  ZeroMemory(@ADxf_PolyLine, sizeof( TDXF_POLYLINE));


TDXF_POLYLINE = TPOLYLINE?

Ещё меня это место смущает:

POLYLINE(AObject^).Count

Я бы написал PPolyline(AObject).Count, а Pointer^ - это, ИМХО, что-то вроде деления на 0 :) Впрочем, если компилируется, значит, можно...

Немного не в тему, но раз структура компилируется несколько раз, я бы подстраховался
TPOLYLINE = packed record


Ещё с т.з. эффективности перенести Closed в конец записи (т.е. сгруппировать однобайтовые поля в одном месте). Хотя вряд ли разница будет заметна невооружённым глазом :)


isasa   (2005-06-11 10:34:00) [6]

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

TPOLYLINE = packed record
  .......


VMcL   (2005-06-10 20:07:00) [7]

>> WondeRu ©   (10.06.05 17:48) [13]

>> Form1.Memo1.Lines

Кхм, кхм...


WondeRu   (2005-06-10 17:48:00) [8]

 TParserStrings = class(TInterfacedObject, IDXFStringList)
 private
   FParser: IParser;
...........
 protected
   function GetCount: Integer; stdcall;
   function GetString(AIndex: Integer): String; stdcall;
   function NextString: String; stdcall;
   procedure OnContent(AType: Integer; AObject: Pointer); stdcall;
 public
..................
 end;

implementation

...............

procedure TDXFParser.OnContent(AType: Integer; AObject: Pointer);
begin
 case AType of
........
   TYPE_POLYLINE:
     begin
       Form1.Memo1.Lines.Add('POLYLINE');
       Form1.Memo1.Lines.Add(format('count=%1d',[POLYLINE(AObject^).Count]));
       .............
       Form1.Memo1.Lines.Add('');
     end;
........
 end;
end;


но ошибка видимо не в этом... а внутри длл в IParser


-=XP=-   (2005-06-10 17:33:00) [9]

интерфейсы и структцры объявлены в одном файле и используются обоими приложениями

Это понятно. Так оно и должно быть.
Только вот, не далее как позавчера, у меня одна константа в разных DLL имела разные значения, сколько не перебилдивал. Оказалось, один из модулей был подключен к компоненту, который тихо лежал на палитре и на одной из форм в одной из DLL. При компиляции этой DLL к ней подключалась не текущая общая версия модуля, а старый пакет, подключенный давным-давно к компоненту.
Так что, если где-то лежат компилированные пакеты - присмотритесь к ним повнимательнее.

А код из OnContent(AType: Integer; AObject: Pointer) увидеть можно? Как там типы данных приводятся?


WondeRu   (2005-06-10 17:21:00) [10]

-=XP=- ©   (10.06.05 17:13) [10]
интерфейсы и структцры объявлены в одном файле и используются обоими приложениями... билдил много раз...


-=XP=-   (2005-06-10 17:13:00) [11]

Типы данных в OnContent приводите?
Уверены, что структуры имеют одинаковое определение в приложении и в библиотеке? Попробуйте перебилдить и программу, и DLL. А кроме того, посмотрите, нет ли где-то какого-то готового откомпилированного модуля, который по умолчанию прилинковывается к программе или библиотеке (но не к обоим).


WondeRu   (2005-06-10 16:49:00) [12]

IStringList = interface
 ['{773E0390-FC01-4C3C-A126-5A604B98AF07}']
   function GetCount: Integer; stdcall;
   function GetString(AIndex: Integer): String; stdcall;
   function NextString: String; stdcall;
   procedure OnContent(AType: Integer; AObject: Pointer); stdcall;
 end;

 IParser = interface
 ['{262BAAA5-69C6-4106-9DBC-D443C22D4712}']
   procedure Connect(AStringList: IDXFStringList); stdcall;
   procedure Disconnect; stdcall;    
   procedure Start; stdcall;
 end;

 TParser = class(TInterfacedObject, IParser)
 private
   FStrings: IStringList;
...........
   procedure RenderLINE(APNode: TPNode);
   procedure RenderPOLYLINE(APNode: TPNode);
 public
...........
 end;

...

procedure TParser.RenderLWPOLYLINE(APNode: TPNode);
var
 APolyLine: TPOLYLINE;
begin
 try
   ZeroMemory(@ADxf_PolyLine, sizeof(TDXF_POLYLINE));
........
заполение структуры
........
   FStrings.OnContent(TYPE_POLYLINE, @APolyLine);
end;


Alexander Panov   (2005-06-10 16:46:00) [13]

WondeRu ©   (10.06.05 16:06)
но при попытке передачи по указателю выдается эксепшен: 'Неверная операция с указателем'


А попытку эту можно увидеть?


-=XP=-   (2005-06-10 16:45:00) [14]

т-с-с-с. Этот код засекречен.

Ой! И точно!
T3Dposition- позиция засекреченного объекта.
Ой! Зачем я это сказал?
Все, пошел заказывать деревянный макинтош... :(

:)


-=XP=-   (2005-06-10 16:42:00) [15]

Так нельзя

Кстати, почему?


TUser   (2005-06-10 16:42:00) [16]

> Код увидеть можно?

т-с-с-с. Этот код засекречен.


-=XP=-   (2005-06-10 16:37:00) [17]

не забыл

И в приложении, и в DLL?

Код увидеть можно?


TUser   (2005-06-10 16:36:00) [18]

Ой, - ты же по указателюпередаешь. Т.е. я так понял - просто даешь указатель на эту структуру? Так нельзя. Передавай ее в виде параметра или как результат функции.


WondeRu   (2005-06-10 16:29:00) [19]

TUser ©   (10.06.05 16:11) [1]
ShareMem не забыл?

не забыл


TUser   (2005-06-10 16:11:00) [20]

ShareMem не забыл?


Наверх

Титульная страница Поиск, карта сайта Написать письмо