Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизПроблема с dll Найти похожие ветки
← →
Ivanov (2006-09-11 00:37) [0]Мастера, подскажите: пытаюсь передать из 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".
← →
Юрий Зотов © (2006-09-11 00:41) [1]ShareMem.
А комментарии читать надо. В Borland"е все же не дураки сидят, просто так не влепили бы.
← →
Германн © (2006-09-11 00:57) [2]И всё-таки лучше в dll использовать родной PChar, imho.
← →
PSPF2003 © (2006-09-11 08:02) [3]Присоединяюсь к [2]
← →
zamtmn © (2006-09-11 08:06) [4]а какая разница pchar или string, всеравно нельзя изменять в exe pchar созданый в dll и наоборот.
← →
zamtmn © (2006-09-11 08:09) [5]лучше shortstring или пересмотреть архитектуру чтоб выделенье/перераспределенье памяти происходило в одном модуле
← →
Ega23 © (2006-09-11 10:09) [6]
> а какая разница pchar или string, всеравно нельзя изменять
> в exe pchar созданый в dll и наоборот.
Интересное кино... Вот всё время можно было, а сегодня, в честь пятилетней годовщины терактов стало нельзя.
← →
Palladin © (2006-09-11 10:43) [7]zamtmn сказал нельзя, значит zamtmn"у нельзя... остальным можно :)
← →
zamtmn © (2006-09-11 13:57) [8]>>Вот всё время можно было
ну тогда будут не громкие ошибки, а тихие утечки памяти
← →
JB (2006-09-11 15:10) [9]
> ну тогда будут не громкие ошибки, а тихие утечки памяти
Каким образом они будут? Ну передал я PChar, что он на лево уйдет, это же указатель - просто 32 битное слово обыкновенное, куда оно может утечь?
← →
Ega23 © (2006-09-11 15:11) [10]
> ну тогда будут не громкие ошибки, а тихие утечки памяти
Согласись, что это от правильности передачи зависит. Если криво - безусловно будут. Если "прямо" - всё прекрасно работает.
← →
Palladin © (2006-09-11 15:15) [11]:) ну да...
если я гдето в программе (где собственными dll и не пахнет) забыл освободить память выделенную под PChar, то конечно это изза того что с dll неправильно работаю...
← →
zamtmn © (2006-09-11 18:48) [12]я имею ввиду что если в длл выделить память под pchar то в exe ее освободить нелязя будет. если выделять память зарание в exe, то получится почти shortstring. ИМХО проще его использовать.
>>Согласись, что это от правильности передачи зависит. Если криво - безусловно будут. Если "прямо" - всё прекрасно работает.
а передавать туда-сюда и string можно, ничего страшного, только придется позаботится чтоб он создавался\ресизился\убивался в одном менеджере памяти
← →
Ega23 © (2006-09-11 19:01) [13]
> я имею ввиду что если в длл выделить память под pchar то
> в exe ее освободить нелязя будет.
?
← →
zamtmn © (2006-09-11 19:17) [14]что значит "?"
без ShareMem получится "Компилируется без проблем, а при запуске "Access Violation"." из первого поста
чем по твоему отличается pchar от string?
← →
Palladin © (2006-09-11 19:18) [15]а чем по твоему?
← →
Ega23 © (2006-09-11 19:20) [16]
> чем по твоему отличается pchar от string?
Интересно, а чем же PChar отличается от String? :о)
← →
zamtmn © (2006-09-11 19:22) [17]а помоему практически ничем, только для стринга операции выделенья\перераспределения памяти "скрыты" от пользователя, с pchar`ом нужно всё проделывать самому
← →
zamtmn © (2006-09-11 19:23) [18]>Ega23
таквсетаки что значит "?"
← →
Palladin © (2006-09-11 19:28) [19]
> zamtmn © (11.09.06 19:22) [17]
угу, замечательно мыслишь, а при чем здесь PChar, String и Dll ?
← →
PSPF2003 © (2006-09-11 19:38) [20]Жуть...
← →
zamtmn © (2006-09-11 19:41) [21]>Palladin
ещераз повторяю. как стринг, так и пчар созданные в dll передавать в exe можно. в exe нельзя их менять - конкретно освободить из них память. ты считаешь что это не так?
← →
zamtmn © (2006-09-11 19:42) [22]>>Жуть...
что конкретно?
← →
PSPF2003 © (2006-09-11 19:48) [23]Да не это я сам с собой… Жуть…
← →
Ega23 © (2006-09-11 19:54) [24]У меня есть 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: Так всё-таки кто в этом случае выделяет память и кто потом её освобождает?
:)
← →
Пусик © (2006-09-11 20:08) [25]
> Вопрос 1: Кто "освобождать" память потом должен? DLL? Или
> всё-таки exe?
DLL. Все-таки.
> А как узнать длину PChar?
Зачем?
> Вопрос 3: А можно ли использовать PChar как callback-параметр
> в dll (написанной даже не на Delphi)?
Только к чему это?
> Вопрос 4: Так всё-таки кто в этом случае выделяет память
> и кто потом её освобождает?
Ответь сам сначала.
У тебя одни вопросы и ни одного ответа.
← →
zamtmn © (2006-09-11 20:10) [26]1. тот кто ее выделил
2. как обычно.
2. да. посмотри как это делается в винапи, данные копируются в уже созданый буфер
4. без разницы, но и выделить и освободить должен один модуль
попробуй сделать getmem в длл, а freemem в ехе, без использования sharemem
← →
zamtmn © (2006-09-11 20:22) [27]>>Ega23
скажи как по твоему в exe освободится pchar созданый в dll?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c