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

Вниз

Как передать динамическую структуру из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.043 c
14-1118336763
NightStranger
2005-06-09 21:06
2005.07.11
Что такое "бинарное дерево"


5-1089664919
boband
2004-07-13 00:41
2005.07.11
Как управлять прорисовкой кнопки?


3-1117451733
evg00
2005-05-30 15:15
2005.07.11
Ошибка при редактировании


14-1118569480
AngeL B.
2005-06-12 13:44
2005.07.11
Ошибка при запуске на ноуте


14-1118052395
Ozone
2005-06-06 14:06
2005.07.11
Файл ответов для MSI





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