Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

Параметры и dll фукции   Найти похожие ветки 

 
Iron Man   (2005-01-27 00:03) [0]

Доброй ночи!
При пережачи в качестве параметра переменной типа TStringList возникают ошибки доступа к памяти.
Можно ли вообще передавать в качестве параметров объекты?


 
Sumor   (2005-01-27 00:10) [1]

По идее, если речь не идёт о хуках, которые так любят в этой конференции, то всё должно быть нормально, хотя могу ошибаться.
Можно попробовать (и это будет правильней) передавать не объекты а указатели на них. Если опять же это не глобальный хук, то всё должно быть.


 
Digitman ©   (2005-01-27 08:14) [2]


> Можно ли вообще передавать в качестве параметров объекты?


можно.


 
Gero ©   (2005-01-27 08:21) [3]


> При пережачи в качестве параметра переменной типа TStringList
> возникают ошибки доступа к памяти.

А, у тебя где-то в районе 17-ой строки ошибка.


 
mutabor   (2005-01-27 09:59) [4]

вроде же надо  указывать SharedMem в uses


 
Iron Man   (2005-01-27 14:20) [5]

mutabor
вроде же надо  указывать SharedMem в uses
- это вряд ли.

Digitman ©
Sumor

Это не хук ;-))
Всё заработало.


 
Digitman ©   (2005-01-27 14:23) [6]


> Iron Man   (27.01.05 14:20) [5]


> это вряд ли


как раз со стринг-листом-то - почти наверняка


> Это не хук


а какая нафих разница, хук или не хук ?


> Всё заработало


аминь.


 
Iron Man   (2005-01-27 14:32) [7]

Digitman ©
как раз со стринг-листом-то - почти наверняка


Как я сразу не сообразил!!! Тм же string"и используются....
Но я вышел из положния, запрятав TStringList в TMemoryStream ;-))


 
Skier ©   (2005-01-27 14:35) [8]

>Iron Man   (27.01.05 14:32) [7]

> Но я вышел из положния, запрятав TStringList в TMemoryStream
> ;-))

И зачем тебе всё это ?


 
Iron Man   (2005-01-27 14:41) [9]

Skier ©
И зачем тебе всё это ?

Надо передать в/из DLL TStringList! Никогда такой потребности не возникало???


 
Skier ©   (2005-01-27 14:44) [10]

>Iron Man   (27.01.05 14:41) [9]
А почему именно TStringList ?


 
Iron Man   (2005-01-27 14:45) [11]

Skier ©
Для удобства ;-))


 
Skier ©   (2005-01-27 14:50) [12]

>Iron Man   (27.01.05 14:45) [11]
ну Вирт с тобой !


 
Piter ©   (2005-01-27 15:17) [13]

Sumor   (27.01.05 0:10) [1]
По идее, если речь не идёт о хуках, которые так любят в этой конференции, то всё должно быть нормально


а при чем здесь хуки?

Можно попробовать (и это будет правильней) передавать не объекты а указатели на них

нда. Ты подумал, прежде чем писать?

Iron Man   (27.01.05 0:03)
Можно ли вообще передавать в качестве параметров объекты?


можно, только осторожно.
В частности, VCL расчитана на использование в главном потоке.
С другой стороны, имхо, к TStringList это не относится


 
REA   (2005-01-27 15:24) [14]

А TMemoryStream тоже запрятать во что-нибудь.


 
Digitman ©   (2005-01-27 15:26) [15]


> Iron Man   (27.01.05 14:32) [7]
> Digitman ©
> как раз со стринг-листом-то - почти наверняка
>
> Как я сразу не сообразил!!! Тм же string"и используются....
> Но я вышел из положния, запрятав TStringList в TMemoryStream
> ;-))


угу.
и как только ты попытаешься модифицировать содержимое переданного MemoryStream"а, ты получишь тот же самый геморрой, что ты поимел со TStringList.
ибо слепые эксперименты на эту тему, вызванные тотальным непониманием механизмов использования менеджеров памяти, рано или поздно приведут задницу к болячкам)


 
Eraser ©   (2005-01-27 15:28) [16]

Piter ©
А при чём тут головной поток? Функции ДЛЛ выполняются в том потоке из которого их вызвали.

Sumor
Термин "передавать объект" и "передаваить указатель на объект" в данном контексте одно и то же.


 
Digitman ©   (2005-01-27 15:39) [17]


> Eraser ©   (27.01.05 15:28) [16]


меж прочим, Piter делает правильный намек .. с учетом того что Iron Man до сих пор не сподобился привести детали того, что у него там в реалии творится и нафига ему это надо ...

если взаимодействующие сгенерированные в Делфи исп.модули используют ран-тайм пакеты и НЕ используют ShareMem, то, как известно, менеджер памяти у них единый.

но если вызываемый модуль (в дан.случае - библиотека) не содержит явно или неявно установленного флага  IsMultiThread = True, то ф-ция, принявшая параметром объект, созданный в вызывающем модуле, и потенциально модифицирующяя дин.структуры в контексте этого объекта, будучи вызванная в доп.треде может привести к печальным для тек.процесса последствиям - синхронизация доступа к менеджеру памяти отсутствует как раз по причине того что IsMultiThread = False


 
Eraser ©   (2005-01-27 20:29) [18]

Digitman ©
Если я не ошибаюсь TStringList- это объект, который не использует GDI функции и не связан с VCL, в том смысле что он не Visual и не Component. Или я что-то путаю?...

А dll является "продолжением" вызывающего процесса, т.е. в идеале поток не должен различать вызвана ли функция из dll или из вызывающего же модуля.


 
Iron Man   (2005-01-27 20:40) [19]

Digitman ©
ибо слепые эксперименты на эту тему, вызванные тотальным непониманием механизмов использования менеджеров памяти, рано или поздно приведут задницу к болячкам


Это не есть хорошо...
Так что же делать? Мне необходимо передавать набор текстовых параметров из приложения в ДЛЛ. Также понадобится сделать callback"и из этой ДЛЛ, тоже с предачей текстовых параметров. Кстати возможен многопоточный вызов...


 
Alexander Panov ©   (2005-01-27 20:41) [20]

Eraser ©   (27.01.05 20:29) [18]
А dll является "продолжением" вызывающего процесса, т.е. в идеале поток не должен различать вызвана ли функция из dll или из вызывающего же модуля.


DLL и основной модуль используют разные менджеры памяти.
Проблема усугубится при использовании могопоточой структуры приложения.


 
Alexander Panov ©   (2005-01-27 20:43) [21]

Iron Man   (27.01.05 20:40) [19]

Для решения такой проблемы в DELPHI используется модуль Sharemem.pas, который нужно указать в uses в качестве первого загружаемого модуля и в .dpr основного проекта, и в dll.

Желательно также при создании DLL-проекта используя Wizard прочитать комментарии к проекту DLL...


 
Iron Man   (2005-01-27 20:55) [22]

Alexander Panov ©
Да прочитал я и каментарии и справку. Пришёл к выводу, что если не использовать строки и динамические массивы и не изменять данные, всё будет работать.


 
Alexander Panov ©   (2005-01-27 21:03) [23]

Iron Man   (27.01.05 20:55) [22]
Пришёл к выводу, что если не использовать строки и динамические массивы


хм... тогда тебе надо смотреть реализвцию TStringList...


 
Iron Man   (2005-01-27 21:09) [24]

Alexander Panov ©
Я вышел из положения, сохранив TStringList в потоке (TMemoryStream), который не изменяется в вызываемом модуле.


 
Alexander Panov ©   (2005-01-27 21:16) [25]

Iron Man   (27.01.05 21:09) [24]
Точно так же ты можешь сохранить TStringList в динамическом массиве и передать в качестве параметра указатель...


 
Iron Man   (2005-01-27 21:34) [26]

Alexander Panov ©
Зачем изобретать велосипед ;-))


 
REA   (2005-01-28 10:07) [27]

Да передай ты PChar указатель на строку с разделением на CR+LF и присвой в Exe StringList.Text := DLLText и все.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.043 c
1-1107270425
Gl
2005-02-01 18:07
2005.02.13
Как использовать процедуру из одного юнита в другом?


3-1105607678
pietro
2005-01-13 12:14
2005.02.13
Как перегнать таблицу в новый формат


1-1106811370
s_pavell
2005-01-27 10:36
2005.02.13
Интересный модуль GraphicEx


1-1106743509
Eyfel
2005-01-26 15:45
2005.02.13
ECO + Delphi 2005


1-1107267779
Руслана
2005-02-01 17:22
2005.02.13
Подскажите как узнать символ сепаратора для даты





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