![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с dll
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]>>Вот всё время можно было
ну тогда будут не громкие ошибки, а тихие утечки памяти