Cum de a lucra cu plugin-uri - totul despre ea, și programare

Am făcut acest lucru - pentru a alege toate DLL din directorul cu programul, pentru a încărca fiecare și să încerce să găsească în ea funcția (prin API-ul GetProcAddress) cu numele rigid predeterminat (de exemplu, ceva de tip IsPluginForMyStuff). În cazul în care a fost găsit - plugin DLL este considerat a fi a mea - dacă nu, descărca și să uitați.







Un set de funcții cauzate de ideea de aceeași pentru toate plug-in-uri, și software-ul (principal) conștient de ce fel de caracteristici arată în DLL. Chiar dacă nu este, atunci nimic nu împiedică să definiți în funcția de plugin, cum ar GetFeatures, returnează o listă de șiruri, numele procedurilor de plugin acceptate.

Iată câteva dintre codul meu de a lucra cu plug-in-uri.

// tipurile de proceduri pentru a stoca referințele la funcția de plugin

TProcessProc = Procedura (config: pointer; cerere: PRequest; răspuns var: PReply);

TConfigProc = Procedura (defcfg: PSysConfig; var config: pointer);

TSaveLoadProc = Procedura (inifile: pointer; var config: pointer);

// Informații despre un plug-in individuale

Nume: shortstring; // Numele complet

Nume fișier: shortstring; // Numele fișierului

Mâner: integer; // Maner DLL încărcate

CFGSize: integer; // configurare dimensiune în RAM

// Lista de plugin-uri încărcate







pgetn: TGetNProc; pgets: TGetSProc; plugin: PPlugin;

// Citește plugin-urile și de a crea o listă a acestora.
Plugins: = TPlugins.Create;
dacă FindFirst ( '* .dll', faAnyFile, sr)<> 0 apoi începe

ShowMessage ( 'Nu a fost găsit plugin-uri.');

Cel mai important lucru de a păstra în minte atunci când proiectarea DLL - nu trebuie să permită o situație în care orice excepție ar rămâne neînregistrată (Mulțumiri Pat Ritchey într-o astfel de consiliere înțelept). Corpul funcțiilor exportate „wrap“ toate blocurile try..except (care a prelucrat remarcabil D.

Sper că aveți aceste două linii mici din principalele module ale DLL dvs. (dacă acesta nu conține manipularea întrerupere): (* face segmente fixe de date DLL în roaming *) GlobalPageUnlock (DSeg); GlobalReAlloc (DSeg, 0, GMEM_MODIFY sau GMEM_MOVEABLE); Dacă nu plasați CE.

Partajarea de fișiere zona de afișare (partajare de memorie mapate fișiere). Consultați următorul cod: HMapping var: THandle; PMapData: pointer; const MAPFILESIZE = 1000, procedura de OpenMap; var llInit: Boolean; lint: Integer; începe HMapping: = CreateFileMapping ($ FFFFFFFF, nil, PAGE_READWRITE, 0, MAPFI.

Cum închid un fișier deschis în DLL (creat în Delphi), și a chemat de la VB? Aceasta este o problemă cunoscută. Aceasta provine din faptul că VB se închide atunci când rulează DOS-5 descriptori standard (0..4). De exemplu, un program pentru a deschide fișierul, reutilizarea acestor descriptori pentru prima Fi deschisă.

Problema este mai degrabă pentru un hacker, nu un programator. Dar există situații când este necesar. Este dificil să ne imaginăm o situație în care ar putea fi util, dar, de exemplu, poate intercepta necesitatea de a cumpăra o obositoare cutie de :) componente. Desigur, acest cod este destinat să mai larg.