Форум: "Основная";
Текущий архив: 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