HookEngineData

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;
      

Bemerkungen:

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';
  }
}     

Verweise: