Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
4-98919
Son!K
2003-08-26 16:00
2003.10.30
Формы


7-98901
IGORYOK
2003-08-18 10:49
2003.10.30
Каким образом можно подсоединиться через номер к мобилке


3-98477
suharew
2003-10-07 23:01
2003.10.30
Ошибки


1-98697
TSa
2003-10-20 00:33
2003.10.30
Перебор


14-98871
Dmitriy O.
2003-09-25 08:55
2003.10.30
Кто делал что то в первые в мире программинга ?





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