2
hurtsyЦитата:
Собственно я как раз передавал TMemoryStream.Memory, что я взял
из инернетовского обсуждения о котором я писал
А, понятно. Я-то опирался на те фрагменты кода, которые вы в этой теме выложили. Извиняйте. :)
Цитата:
Я прицеплял Memory к TMemoryStream функцией .Read
Боюсь, что придется воспользоваться наследованием от
TCustomMemoryStream, чтобы иметь возможность вызывать
SetPointer для связывания с буфером... Или работать с буфером как с обычной памятью, т.е. передавать указатель типа
Pointer из свойства
.Memory и размер типа
Int64 из свойства
.Size, и в таком виде использовать без привязки к обертке...
При использовании
Read, видимо, надо предварительно делать
SetSize или вместо этого всего применять
ReadBuffer. Но в любом случае при этом будет осуществляться не "привязка", а (дорогое) копирование данных...
Цитата:
А обсуждение ShareMem мне не попадалось. Мне кажется там просто какая то описка, в больших проектах это неизбежно
Но у вас-то не тот случай с этим
TMemoryStream'ом... Как я понимаю, проблемы возникают тогда, когда вы проводите операции с памятью, например с delphi-строками, в одном модуле (в "вызывающей программе"), используя при этом встроенный менеджер памяти, а потом с тем же куском памяти пытаетесь что-то делать в другом модуле (в библиотеке) тоже используя встроенный менеджер памяти, но уже скомпонованный с этим вторым модулем и хранящий свое состояние отдельно.
Казалось-бы, адресное пространство-то одно и тоже, но договорится между собой эти два менеджера никак не могут. Лечится только обращением к внешнему, общему для всех модулей менеджеру, неважно, системному или "фирменному" *mm.dll. И все это есть следствие самой философии delphi; при более классическом подходе таких вопросов-бы просто не возникло. :)
Впрочем, наверное вы правы... В крупном delphi-проекте (сразу вопрос в сторону, а с какого перепугу кто-то рискует поднимать крупные проекты на delphi? :) ) может быть все, в том числе и передача динамических объектов вроде строк и массивов между отдельно скомпилированными модулями (между прочим, применение внешнего менеджера памяти подразумевает некоторый оверхед по быстродействию)...