procedure InitDLLData(MForm:Pointer);export;
var
t:TPanel;
begin
MainForm:=MForm;
t:=TPanel(TForm(MainForm^).FindChildControl('targeterPanel'));
ToWrite:=TMemo(t.FindChildControl('SnifferFull'));
ToWrite.Lines.Append('Catching since '+TimeToStr(Now)+'...');
end;
Shared Memory
Возникла такая проблема: нужно повесить хук WH_GETMESSAGE и со всех приложений информацию о получаемых сообщениях записывать в TMemo в моем приложении, чтобы потом повторить последовательность действий. Дело в следующем: хук на WH_GETMESSAGE я расположил в DLL, а образ этой DLL для каждого приложения отображается свой и поэтому в Memo записываются строки о событиях только на моем приложении, а при переводе мышки на другое хук сразу спадает, т.к. скорее всего DLL-образ не смог обратиться к моему адресному пространству. Есть ли какой-нибудь способ передавать массивы строк или TStringList между адресными пространствами?
Из DLL нахожу свой Memo по Pointer
Код:
InitDLLData вызвается лишь один раз из моей программы.
PS. Данные типа hWnd и Integer передавал с помощью CreateFileMapping и MapViewOfFile, но со строками почему-то возникла трудность.
PPS. Раньше работал с WH_JOURNALRECORD прямо в своем приложении, но в этом случае не ловятся некоторые из нужных сообщений.
А вот насчёт передачи строк и данных - тут лучше использовать именованные програмные каналы (named pipes) - меньше траблов с синхронизацией (задача "поставщик-приёмник" решается на уровне ReadFile и WriteFile).
CreateNamedPipe - создаёт канал
ConnectNamedPipe - ждёт, момента подключения конца канала
CreateFile - подключается к каналу
ReadFile, WriteFile - читает/пишет в канал
Спасибо за идею. Вроде что-то подходящее. Буду изучать дальше.