typedef struct HookEngineData_tag {
KADMOS_ERROR (KADMOS_API *HookRecDoStart)(RecData *);
KADMOS_ERROR (KADMOS_API *HookRecDoEnd)(RecData *);
KADMOS_ERROR (KADMOS_API *HookRelDoStart)(RelData *);
KADMOS_ERROR (KADMOS_API *HookRelDoEnd)(RelData *);
KADMOS_ERROR (KADMOS_API *HookRepDoStart)(RepData *);
KADMOS_ERROR (KADMOS_API *HookRepDoEnd)(RepData *);
} HookEngineData;
Anschluss einer Hook-Engine KADMOS bietet die Möglichkeit, unmittelbar vor und direkt nach der Erkennung
eines Zeichens, einer Zeile oder einer Textseite eigene, anwenderspezifische Funktionen aufzurufen. Diese Funktionen sind
in einer externen Datenstruktur bereitzustellen.
Zusätzlich muss beim Parameter general der Wert GENERAL_HOOKENGINE_ON gesetzt sein.
Diese anwenderspezifischen Funktionen können direkt in eine Applikation eingebunden werden. Unter Windows können sie
jedoch auch zur Laufzeit des Programms als Dll bereitgestellt werden. Die entsprechenden Entries der Dll
müssen RecDoStart, RecDoEnd, RelDoStart, RelDoEnd, RepDoStart
beziehungsweise RepDoEnd heissen. Bei jedem Aufruf von rec_init(), rel_init()
oder rep_init() sucht KADMOS in verschiedenen Verzeichnissen nach einer Dll-Datei mit dem Namen "KADMOSHook.dll".
Reihenfolge der Suche:
- Verzeichnis einer Umgebungsvariablen KADMOSxx (xx beschreibt die Versionsnummer ohne Punkt).
- Exe-Verzeichnis.
- Current-Verzeichnis.
- Verzeichnis über dem Current-Verzeichnis.
- System-Verzeichnis.
- Windows-Verzeichnis.
Wird in einem der obigen Verzeichnisse eine KADMOSHook.dll gefunden, so wird sie geladen und Entries werden -
soweit vorhanden - in die Datenstruktur KADMOSHookEngine eingetragen. Falls keine derartige Dll gefunden wurde,
sucht KADMOS schliesslich noch mit folgender Routine, ob anderweitig ein Dll-Name bereitgestellt wurde:
if (!*dll_path) {
HWND hWindow;
unsigned short hAtom;
hWindow = FindWindow("KADMOSHookActivate", NULL);
if (hWindow) {
Sleep (2000);
hAtom = (unsigned short)SendMessage (hWindow, WM_USER, 1, 0);
if (hAtom) {
GlobalGetAtomName (hAtom, dll_path, sizeof(dll_path));
GlobalDeleteAtom (hAtom);
}
}
if (*dll_path) {
if (!HookDllVersionOk(dll_path))
*dll_path = '\0';
}
}