Форум: "Основная";
Текущий архив: 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