Главная страница
    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-68004
Ru
2003-07-01 17:39
2003.07.21
Ваша СМЕРТЬ?


1-67799
Frist_May
2003-07-07 09:27
2003.07.21
Событие OnChange


14-68070
SergP
2003-07-04 20:34
2003.07.21
Как засчитывается посещение сайта?


14-68014
AlexRush
2003-07-03 20:39
2003.07.21
А помнит ли кто нибудь первоначальное значение слова hacker ?


3-67700
ses
2003-06-27 10:56
2003.07.21
ADO - из программы вызвать диалог построения строки соединения





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