Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.014 c
2-1158147823
VitV
2006-09-13 15:43
2006.10.01
FastReport-запрос в отчёте


15-1157814167
ArtemESC
2006-09-09 19:02
2006.10.01
Английский...


15-1157900925
новоалексан
2006-09-10 19:08
2006.10.01
Как создать true type шрифт?


2-1157719417
arhis
2006-09-08 16:43
2006.10.01
Автоматическое закрыте формы


15-1157782661
Дураг
2006-09-09 10:17
2006.10.01
Покритикуйте формулировку темы реферата на кандминимум.





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