Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];

Вниз

Динамические массивы и DLL несовместимы?   Найти похожие ветки 

 
Alex_DM   (2003-07-08 14:25) [0]

Не пойму в чем ошибка?

В Dll две функции:
- создание динамического массива;
- его удаление.

library vostok;

const
ColCount = 2; //временные константы
RowCount = 2; //в будущем задаются из хоста

type
MyCell = record
TagRead: PChar;
TagWrite: PChar;
ItemHndRead: OPCHANDLE; //DWORD
ItemHndWrite: OPCHANDLE; // DWORD
LocalFormat: PChar;
Init: Char;
end;
TArrRec = array of array of MyCell;

var
Mass: TArrRec;

.........................
{создание динамичекого массива, заполнение и передача в хост}
function CreateMass():TArrRec;stdcall;
var
i, j: Word;
begin
Mass := nil;
SetLength(Mass, ColCount, RowCount);
for i := 0 to High(Mass) do
for j := 0 to High(Mass[i]) do
begin
Mass[i,j].ItemHndRead := i;
Mass[i,j].ItemHndWrite := j;
Mass[i,j].TagRead := PChar("TAGREAD"+IntToStr(i)+IntToStr(j));
end;
Result := Mass;
end;

{удаление массива}
function DeleteMass: Boolean; stdcall;
begin
Mass := nil;
Result := Mass = nil;
end;

...................................

exports
GetPluginInfo,
CreateMass,
DeleteMass;

begin
end.

///////////////////////////////////////////////////////////////
В основной программе (в хосте):

.......

MyCell = record
------ " --------
end;
TArrRec = array of array of MyCell;

var
Mass: TArrRec;
CreateMass: function : TArrRec stdcall;
DeleteMass: function : Boolean stdcall;
hDLL: THandle;
.............................

procedure TfrmUst.FormCreate(Sender: TObject);
var
dwErr: DWORD;
begin
hDLL := 0;
hDLL := LoadLibrary("vostok"); //загрузка DLL
if (hDLL = 0)
then begin
dwErr := GetLastError();
if (dwErr = ERROR_DLL_NOT_FOUND)
then raise
....................
end
else begin
Mass := nil;
@CreateMass := GetProcAddress(hDLL, "CreateMass");
if @CreateMass <> nil
then begin
Mass := CreateMass; //вызов массива
end;
............................
@DeleteMass := GetProcAddress(hDLL, "DeleteMass");
if @DeleteMass <> nil
then begin
DeleteMass; //удаление массива
end;
end;
end;

{****** выгрузка DLL из памяти *********}
procedure TfrmUst.FormDestroy(Sender: TObject);
begin
Mass := nil;
if (hDLL <> 0)
then if (not FreeLibrary(hDLL))
then ShowMessage("Error download Vostok.DLL!");
end;

///////////////////////////////////////////////////////////

При закрытии формы выдается следующая ошибка:

Application Error
Exception EAccessViolation in module ... at ...
Access Violation at address ... in module ... . Read of address ...

Откуда?????? Почему???
Эта ошибка НЕ возникает в двух случаях:
- когда в хосте не происходит выделение памяти под динамический массив (что не возможно выкинуть из программы),
ИЛИ
- когда в хосте не происходит выгрузка DLL из памяти (что в общем-то не корректно).

Что делать?

Заранее благодарен за ответ.


 
MBo   (2003-07-08 14:26) [1]

sharemem есть?


 
Alex_DM   (2003-07-08 14:31) [2]

Конечно:

library vostok;

uses
ShareMem,
SysUtils,
OPCtypes,
Windows,
Classes;

....................



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.008 c
14-68009
XobBIT
2003-07-04 12:35
2003.07.21
Мастера подскажите как получить палитру bmp файла?


14-68037
NikotiN
2003-07-04 20:48
2003.07.21
к мастерам


1-67839
Пубертанец
2003-07-07 16:56
2003.07.21
В аргументе Variant функции необходимо передать массив


1-67844
Man
2003-07-07 18:51
2003.07.21
использование форм-шаблонов


14-68008
Evgeniy
2003-07-04 09:33
2003.07.21
Распознавание текста





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