![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать динамическую структуру из 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 не забыл?