Есть dll-ка, которая должна взаимодействовать с приложением написанным на делфи, обмениваться с ним строками, работать с его объектами. Для этого требуется подключится к его менеджеру памяти. Вот в этом и заключается проблема - приложение не использует ни рантайм-пакеты, ни ShareMem. Переписать его тоже невозможно. Пока что единственный вариант добраться до переменной System.MemoryManager, который я вижу, это искать в памяти переменную System.runErrMsg, а от нее уже отсчитывать нужное смещение. Может кто знает более правильный способ?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
20-04-2010 05:10
Самое нормальное, что можно сделать - попросить автора программы предоставить интерфейс.
Потому что в противном случае вам остаётся только жёсткая привязка к exe-шнику. Например, запись конкретного указателя по конкретному смещению (указатель на GetMem), который имеет все основания поплыть с выходом новой версии программы.
RTTI каждого приложения (и библиотеки) уникально. Пользоваться им извне не получится.
Что вы имеете ввиду под словом "уникально"? Пока что у меня такой тестовый код работает:
uses
ShareMem, TypInfo, SysUtils, Classes;
procedure GetRttiEntries(o:TObject; out s:string);
var
PL: PPropList;
i, count: Integer;
begin
s:='';
count:=GetPropList(o, pl);
for i:= 0 to count-1 do
s:=s+#13#10+pl^[i].Name;
FreeMem(PL);
SetStrProp(o, 'Caption', 'Hi From dll!');
end;
exports
GetRttiEntries;
Общий тут только менеджер памяти, рантайм пакеты не используются.
Проблема в том, что автор программы ничего не знал про мою библиотеку. Фактически у меня задача "взаимодействие с контролами чужого приложения". Само взаимодействие я планирую организовать через RTTI, но для этого нужно подключится к чужому менеджеру памяти.
19-04-2010 01:41 | Вопрос к автору: запрос дополнительной информации
А в библиотеке-то для этого что-то предусмотрено? Или всё дело в том, что её написал ламер, который передачу строк поставил, а про менеджер памяти не подумал?
приложение не использует ни рантайм-пакеты, ни ShareMem. Переписать его тоже невозможно.
Тогда никак.
Конечно, для строк можно использовать WideString, а на создание и уничтожение объектов можно назначить кого-нибудь одного, но в любом случае приложение необходимо переписывать под эту реализацию.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.