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

Вниз

Динамические массивы и 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
3-67661
Дучф
2003-06-25 23:18
2003.07.21
Ошибка при добавлении в таблицу


6-67956
Den_IS01
2003-05-14 13:26
2003.07.21
Принудительно перейти по ссылке в TWebBrouser


14-68005
Sheng
2003-07-03 22:47
2003.07.21
На тему The Matrix


14-68066
Den
2003-07-03 09:09
2003.07.21
TTable глючит?


14-68074
VictorT
2003-07-05 22:23
2003.07.21
Народ, вы счас можете на форум Дремучих зайти?