Текущий архив: 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.49 MB
Время: 0.052 c