Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с dll


Страницы:   1 2

Ivanov ©   (2006-09-11 00:37:00) 

Мастера, подскажите: пытаюсь передать из dll переменную типа string, а в результате - Access Violation. Кто знает в чем причина, подскажите.

В библиотеке значится следующее:
....
function Text1(c: String): String; stdcall;
begin
c := 'first';
Result := c;
end;
....
exports
....
Text1;

А в исполнимом файле:
.....
TText = function(c: String): string; stdcall;
....
Text1: TText;
....
var
i: String;
....
a := LoadLibrary('1.DLL');
if a <> 0 then
 begin
 @Text1 := GetProcAddress(a, 'Text1');
   if @Text1 <> nil then
   i := Text1(c);
....
Компилируется без проблем, а при запуске "Access Violation".


zamtmn   (2006-09-11 20:22:00) [1]

>>Ega23
скажи как по твоему в exe освободится pchar созданый в dll?


zamtmn   (2006-09-11 20:10:00) [2]

1. тот кто ее выделил
2. как обычно.
2. да. посмотри как это делается в винапи, данные копируются в уже созданый буфер
4. без разницы, но и выделить и освободить должен один модуль
попробуй сделать getmem в длл, а freemem в ехе, без использования sharemem


Пусик   (2006-09-11 20:08:00) [3]


> Вопрос 1: Кто "освобождать" память потом должен? DLL? Или
> всё-таки exe?


DLL. Все-таки.

> А как узнать длину PChar?


Зачем?


> Вопрос 3: А можно ли использовать PChar как callback-параметр
> в dll (написанной даже не на Delphi)?


Только к чему это?


> Вопрос 4: Так всё-таки кто в этом случае выделяет память
> и кто потом её освобождает?


Ответь сам сначала.

У тебя одни вопросы и ни одного ответа.


Ega23   (2006-09-11 19:54:00) [4]

У меня есть dll, которая формирует что-то. Допустим какой-то хитрый битмап. По каким-то своим хотрым правилам.
Как мне из exe получить этот файл? Точнее битмап. Очень просто: в dll организую функцию GetBitmap(var buffer:Pointer; var Size : Integer);
После чего при вызове её:
var
bimap:Pointer;
Size:Integer;
begin
 GetBitmap(bitmap, Size);


После данного вызова в bitmap у меня адрес, с которого начинается мой буфер, Size - размер буфера.
Вопрос 1: Кто "освобождать" память потом должен? DLL? Или всё-таки exe?
Вопрос 2: А как узнать длину PChar?
Вопрос 3: А можно ли использовать PChar как callback-параметр в dll (написанной даже не на Delphi)?
Вопрос 4: Так всё-таки кто в этом случае выделяет память и кто потом её освобождает?
:)


PSPF2003   (2006-09-11 19:48:00) [5]

Да не это я сам с собой… Жуть…


zamtmn   (2006-09-11 19:42:00) [6]

>>Жуть...
что конкретно?


zamtmn   (2006-09-11 19:41:00) [7]

>Palladin
ещераз повторяю. как стринг, так и пчар созданные в dll передавать в exe можно. в exe нельзя их менять - конкретно освободить из них память. ты считаешь что это не так?


PSPF2003   (2006-09-11 19:38:00) [8]

Жуть...


Palladin   (2006-09-11 19:28:00) [9]


> zamtmn ©   (11.09.06 19:22) [17]

угу, замечательно мыслишь, а при чем здесь PChar, String и Dll ?


zamtmn   (2006-09-11 19:23:00) [10]

>Ega23
таквсетаки что значит  "?"


zamtmn   (2006-09-11 19:22:00) [11]

а помоему практически ничем, только для стринга операции выделенья\перераспределения памяти "скрыты" от пользователя, с pchar`ом нужно всё проделывать самому


Ega23   (2006-09-11 19:20:00) [12]


> чем по твоему отличается pchar от string?


Интересно, а чем же PChar отличается от String?  :о)


Palladin   (2006-09-11 19:18:00) [13]

а чем по твоему?


zamtmn   (2006-09-11 19:17:00) [14]

что значит "?"
без ShareMem получится "Компилируется без проблем, а при запуске "Access Violation"." из первого поста
чем по твоему отличается pchar от string?


Ega23   (2006-09-11 19:01:00) [15]


> я имею ввиду что если в длл выделить память под pchar то
> в exe ее освободить нелязя будет.


?


zamtmn   (2006-09-11 18:48:00) [16]

я имею ввиду что если в длл выделить память под pchar то в exe ее освободить нелязя будет. если выделять память зарание в exe, то получится почти shortstring. ИМХО проще его использовать.
>>Согласись, что это от правильности передачи зависит. Если криво - безусловно будут. Если "прямо" - всё прекрасно работает.
а передавать туда-сюда и string можно, ничего страшного, только придется позаботится чтоб он создавался\ресизился\убивался в одном менеджере памяти


Palladin   (2006-09-11 15:15:00) [17]

:) ну да...
если я гдето в программе (где собственными dll и не пахнет) забыл освободить память выделенную под PChar, то конечно это изза того что с dll неправильно работаю...


Ega23   (2006-09-11 15:11:00) [18]


> ну тогда будут не громкие ошибки, а тихие утечки памяти


Согласись, что это от правильности передачи зависит. Если криво - безусловно будут. Если "прямо" - всё прекрасно работает.


JB   (2006-09-11 15:10:00) [19]


> ну тогда будут не громкие ошибки, а тихие утечки памяти

Каким образом они будут? Ну передал я PChar, что он на лево уйдет, это же указатель - просто 32 битное слово обыкновенное, куда оно может утечь?


zamtmn   (2006-09-11 13:57:00) [20]

>>Вот всё время можно было
ну тогда будут не громкие ошибки, а тихие утечки памяти


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо