Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизDLL Найти похожие ветки
← →
BOA_KAA (2003-10-16 16:58) [0]Возникла необходимость переместить некоторые подпрограммы в DLL-ку. Но у меня очень широко используются в качестве параметров динамические массивы.
Как передавать массивы в этом случае (заранее количество элементов массива неопределено)? Переходить на указатели на начало массива и число его элементов? Или можно обойтись меньшей кровью?
Заранее спасибо!
← →
MBo (2003-10-16 17:00) [1]DLL будет использоваться только в Дельфи? (это насчет Sharemem)
← →
BOA_KAA (2003-10-16 17:12) [2]Скорее всего нет. Поэтому и возник вопрос.
← →
MBo (2003-10-16 17:14) [3]Тогда указатель и число элементов. Не забудь, что корректно изменить его длину в функции в таком случае не выйдет.
← →
BOA_KAA (2003-10-16 17:16) [4]
> Не забудь, что корректно изменить его длину в функции в
> таком случае не выйдет
То есть можно использовать только имеющееся число элементов и расширить его нельзя, так я понял?
← →
MBo (2003-10-16 17:23) [5]Да, именно так. Это связано с менеджером памяти - при использовании Sharemem корректно обрабатывается счетчик ссылок и длина массива.
← →
BOA_KAA (2003-10-17 10:22) [6]Тогда еще один вопрос. Допустим, у меня есть некоторая функция в DLL, описанная, например, так:
type
PArray = ^TArray;
TArray = array [0..0] of TDoublePoint;
var
aPoly:
function Inside(aPoly: PArray; Count: Integer): Integer;
begin
...
end;
Тогда могу я вызвать ее из программы, используя динамические массив?
var
aPoly: array of TDoublePoint;
Ok:=Inside(aPoly, High(aPoly)-Low(aPoly)+1);
← →
Zergling (2003-10-17 10:53) [7]MBo © (16.10.03 17:23) [5]
>> Да, именно так. Это связано с менеджером памяти - при использовании Sharemem корректно обрабатывается счетчик ссылок и длина массива.
Где нибудь есть статья по этому поводу? А то я тоже с этим же когда то парился (ничего не выходило и забросил). Вон незнал блин, что такая особенность есть с динамическими массивами в DLL.
← →
BOA_KAA (2003-10-17 12:05) [8]up, извините
<offtop>
что-то сегодня всех на длл прорвало
</offtop>
← →
REA (2003-10-17 12:07) [9]Если DLL используется только в Delphi лучше делать не DLL, а BPL - тогда не нужен Sharemem, можно использовать классы, отпадает проблема с различными таблицами виртуальных методов. Неудобство - при изменении классов требуется перекомпиляция всего.
← →
panov (2003-10-17 12:11) [10]Для того, чтобы корректно работать с массивом внутри DLL, можно динамически создавать, реорганизовывать массивы в DLL. для этого все операции с массивами проводятся функциями, определенными в DLL.
Функциям для идентификации массива достаточно передавать указатель(Pointer).
← →
Verg (2003-10-17 12:21) [11]
> Тогда могу я вызвать ее из программы, используя динамические
> массив?
>
> var
> aPoly: array of TDoublePoint;
>
> Ok:=Inside( PArray(aPoly), High(aPoly)-Low(aPoly)+1);
По-моему так.
Кроме того,
High(aPoly)-Low(aPoly)+1 - это просто length(aPoly)
← →
BOA_KAA (2003-10-17 12:50) [12]
> REA © (17.10.03 12:07) [9]
> Если DLL используется только в Delphi лучше делать не DLL,
> а BPL
К моему горькому сожалению, я еще не знаю, на чем придется писать основную часть. Пока что идет артподготовка :)
> panov © (17.10.03 12:11) [10]
> Функциям для идентификации массива достаточно передавать
> указатель(Pointer)
То есть достаточно указателя на aPoly в моем случае? Чего-то я никак не могу сообразить, как записать в вызов в данном случае?
Что-то вроде
Ok:=Inside(PArray(aPoly));
как Verg © посоветовал и не давать второго параметра - количества элементов, а определять его в DLL?
← →
MBo (2003-10-17 13:08) [13]>То есть достаточно указателя на aPoly в моем случае? Чего
достаточно procedure ProcInDll(var A; Count:Integer);
передавать обычный массив:
ProcInDll(Arr, Count);
динамический:
ProcInDll(DynArr[0],Count);
>Zergling © (17.10.03 10:53) [7]
возможно, в Тексейре об этом написано.
Кроме того, на форумах периодически обсуждается.
← →
Verg (2003-10-17 13:12) [14]
> Ok:=Inside(PArray(aPoly));
> как Verg © посоветовал и не давать второго параметра - количества
> элементов, а определять его в DLL?
Я вообще-то говорил про
Ok:=Inside(PArray(aPoly), length(aPoly));
>а определять его в DLL
Как ты его определишь-то (в DLL)? Только если "догадаешься" :)))
← →
BOA_KAA (2003-10-17 13:14) [15]Ага, понял, спасибо огромное
PS.
> Verg © (17.10.03 13:12) [14]
> Я вообще-то говорил про
> Ok:=Inside(PArray(aPoly), length(aPoly));
Я по сути :)
← →
panov (2003-10-17 15:55) [16]Пример DLL для работы с динамическим массивом:
library SmplArr;
type TDynArray = array of Integer;
type PDynArray = ^TDynArray;
function NewArray(const aCount: Integer=0): Pointer;stdcall;
var
Arr: PDynArray;
begin
Result := nil;
New(Arr);
SetLength(Arr^,aCount);
Result := Arr;
end;
procedure DeleteArray(const aDynArray: Pointer);stdcall;
var
Arr: PDynArray;
begin
Arr := aDynArray;
Dispose(Arr);
end;
function AddElemArray(const aDynArray: Pointer;const aElem: Integer=0): Integer;stdcall;
var
Arr: PDynArray;
begin
Arr := aDynArray;
Result := Length(Arr^)+1;
SetLength(Arr^,Result);
Arr^[Result-1] := aElem;
end;
procedure ChangeElemArray(const aDynArray: Pointer;const aIndex,aElem: Integer);stdcall;
var
Arr: PDynArray;
begin
Arr := aDynArray;
Arr^[aIndex] := aElem;
end;
function LengthArray(const aDynArray: Pointer): Integer;stdcall;
var
Arr: PDynArray;
begin
Arr := aDynArray;
Result := Length(Arr^);
end;
exports
NewArray,
AddElemArray,
ChangeElemArray,
DeleteArray,
LengthArray;
end.
← →
BOA_KAA (2003-10-17 16:10) [17]Ух ты! Спасибочки!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c