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

Вниз

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

 
WondeRu ©   (2005-06-10 16:06) [0]

Здравствуйте, уважаемые!
Столнкулся с необъяснимым пытаюсь передавать из 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  и приложением?


 
TUser ©   (2005-06-10 16:11) [1]

ShareMem не забыл?


 
WondeRu ©   (2005-06-10 16:29) [2]

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

не забыл


 
TUser ©   (2005-06-10 16:36) [3]

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


 
-=XP=- ©   (2005-06-10 16:37) [4]

не забыл

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

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


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

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

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


 
-=XP=- ©   (2005-06-10 16:42) [6]

Так нельзя

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


 
-=XP=- ©   (2005-06-10 16:45) [7]

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

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

:)


 
Alexander Panov ©   (2005-06-10 16:46) [8]

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


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


 
WondeRu ©   (2005-06-10 16:49) [9]

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;


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

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


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

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


 
-=XP=- ©   (2005-06-10 17:33) [12]

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

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

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


 
WondeRu ©   (2005-06-10 17:48) [13]

 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


 
VMcL ©   (2005-06-10 20:07) [14]

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

>>Form1.Memo1.Lines

Кхм, кхм...


 
isasa ©   (2005-06-11 10:34) [15]

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

TPOLYLINE = packed record
  .......


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

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 в конец записи (т.е. сгруппировать однобайтовые поля в одном месте). Хотя вряд ли разница будет заметна невооружённым глазом :)


 
Dimaxx ©   (2005-06-11 19:48) [17]

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

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


 
Shuric ©   (2005-06-11 19:51) [18]

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


 
VMcL ©   (2005-06-11 22:15) [19]

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

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

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


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

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

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



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

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

Наверх




Память: 0.52 MB
Время: 0.031 c
1-1119439444
Dysan
2005-06-22 15:24
2005.07.11
параметр packed и его использование


14-1118538574
Defunct
2005-06-12 05:09
2005.07.11
Нонсенс..


14-1118151898
Freddy
2005-06-07 17:44
2005.07.11
ПОМОЩЬ! Табуляция


14-1118254778
digger
2005-06-08 22:19
2005.07.11
Обрезали UTP кабель :-(


1-1119344388
Антон Г.
2005-06-21 12:59
2005.07.11
Проблема с TFont