Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
15-1157951970
Ega23
2006-09-11 09:19
2006.10.01
С Днём рождения! 9 сентября


3-1152986150
Silver...
2006-07-15 21:55
2006.10.01
DataSet.Locate не дружит с Filter, а надо - как быть


1-1155908506
Strip
2006-08-18 17:41
2006.10.01
Open with menu


2-1157969053
Officeman
2006-09-11 14:04
2006.10.01
Поиск строки в строке ;)


1-1156148868
DelphiLexx
2006-08-21 12:27
2006.10.01
Продвинутый PaintTo