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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
4-98923
aldapooh
2003-08-26 12:01
2003.10.30
Работа с учетными записями (продолжение)


4-98938
aldapooh
2003-08-22 14:22
2003.10.30
Работа с учетными записями


14-98823
Карлсон
2003-10-11 23:41
2003.10.30
Деликатесы - мировое кино!


14-98793
Gfa
2003-10-04 19:37
2003.10.30
MyIE


1-98603
NewD
2003-10-19 13:56
2003.10.30
Как в CGI сохранять файл ?