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

Вниз

Dll   Найти похожие ветки 

 
Unknown   (2003-11-12 12:09) [0]

Делаю обмен параметрами формы с динамической Dll; нужные значения получил и сразу же выкидуется сообщение об ошибке в приложении


 
Digitman   (2003-11-12 12:16) [1]

поздравляю


 
Unknown   (2003-11-12 12:19) [2]

Вот процедура чтение данных

procedure TForm1.Button3Click(Sender: TObject);
type
TLoad=procedure(var a:string;var b:integer);
var
hdll:THandle;
Load:TLoad;
s:string;
i:integer;
begin
hdll:=LoadLibrary("Boot");
@Load:=GetProcAddress(hdll,"Load");
Load(s,i);
ShowMessage(s);
ShowMessage(IntToStr(i));
FreeLibrary(hdll);
end;


 
Digitman   (2003-11-12 12:40) [3]

и какое же сообщение ? "выкидуется" у тебя ? гадать будем ?


 
AbrosimovA   (2003-11-12 12:51) [4]

А у тебя есть uses ShareMem?
А в процедуре LoadLibrary разве не полностью пишется Boot.dll?
А где код самой dll?
И т.д.......


 
АлексейК   (2003-11-12 13:16) [5]

String из Dll, конечно можно но аккуратно, а ошибка наверное на FreeLibrary(hdll);


 
han_malign   (2003-11-12 14:03) [6]

> String из Dll, конечно можно но аккуратно
- здесь явно не аккуратно, т.к. String здесь Var параметр.

Ошибка(вероятнее всего AV) происходит после ShowMessage(s); - когда менеджер памяти приложения пытается освободить локальную строку S, которая была создана в менеджере памяти DLL.

Циклограмма:
1. Автоматическая инициализация локальной переменой S=nil (compiler magic - для строк, динамических массивов и интерфейсов(аналогично для полей перечисленых типов, локальных переменных структурного типа(record)), т.к., у них задействован механизм подсчета ссылок(для автоматического управления выделением памяти))
................
2. Load(s,..) - передача @s в DLL .
DLL: 3. Выделение памяти для s (в одном аддресном пространстве, но с разными менеджерами памяти)...
4. ShowMessage(s) (s - не изменяется, реалокации памяти не происходит).
5. Освобождение локальной строки S, соданной в другом менеджере памяти - получаем AV.
ЧТД

см. AbrosimovA - "uses ShareMem"


 
Unknown   (2003-11-12 17:11) [7]

Ошибка

Project Project1.exe raised exception class EInvalidPointer with message "Invalid pointer operation".

Исходник библиотеки

library Boot;

uses
windows,
SysUtils,
Classes,
ShareMem,
Forms,
DB,
DBTables;

type
TTable1=class(TTable)
end;

var
Table:TTable1;

{$R *.res}

procedure Load(var s:string;var i:integer);
begin
i:=0;
Table:=TTable1.Create(Application);
Table.DatabaseName:=GetCurrentDir;
Table.TableName:="Data.db";
Session.AddPassword("sppasformyform");
Table.Active:=True;
Table.First;
s:=Table.FieldByName("Text").AsString;
i:=1;
Table.Next;
while not Table.Eof do
begin
s:=s+#13+Table.FieldByName("Text").AsString;
inc(i);
Table.Next;
end;
Table.Close;
end;

exports
Load;

begin
end.


 
Digitman   (2003-11-12 17:18) [8]

ты читал это ?

If a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.

ShareMem is the interface unit for the BORLANDMM.DLL memory manager, which allows modules to share dynamically allocated memory. BORLANDMM.DLL must be deployed with applications and DLLs that use ShareMem. When an application or DLL uses ShareMem, its memory manager is replaced by the memory manager in BORLANDMM.DLL.


 
han_malign   (2003-11-12 17:50) [9]

> Digitman © (12.11.03 17:18) [8]
- эт еще не все:

If a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.

ShareMem is the interface unit for the BORLANDMM.DLL memory manager, which allows modules to share dynamically allocated memory. BORLANDMM.DLL must be deployed with applications and DLLs that use ShareMem. When an application or DLL uses ShareMem, its memory manager is replaced by the memory manager in BORLANDMM.DLL.


 
Digitman   (2003-11-12 17:54) [10]


> han_malign


ну это да, это как бы подразумевалось , что автор учел ...
хотя ... шут его знает)...



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

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

Наверх




Память: 0.46 MB
Время: 0.009 c
6-79081
beglec
2003-09-29 01:13
2003.11.24
Некоторые изменения в Delphi 7


7-79213
Shopot
2003-09-13 16:31
2003.11.24
Шрифты для матричного принтера


1-78997
ostap
2003-11-14 11:54
2003.11.24
Создать таблицу


3-78833
SasaR
2003-11-04 13:34
2003.11.24
LookUp поле - динамически ???


1-78965
glitch
2003-11-14 18:49
2003.11.24
Уведомление об изменении реестра





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