Как се работи с плъгини - всичко за него, и програмиране

Аз направих така - за да изберете всички DLL от указателя с програмата, за да заредите всеки и се опита да намери в него функция (чрез API GetProcAddress) със строго предварително определено име (например нещо IsPluginForMyStuff тип). Ако не са открити - DLL плъгин се счита за мой - ако не, се разтоварят и да забравите.







Набор от функции, причинени от идеята за една и съща за всички приставки и софтуер (основна) наясно с какви функции тя изглежда в DLL. Дори и ако не е, тогава нищо не пречи да дефинирате във функцията плъгин като GetFeatures, връща списък от низове, имената на поддържаните плъгин процедури.

Ето и някои от моя код за работа с плъгини.

// вида процедура, за да се съхранява препратки към функцията за плъгин

TProcessProc = процедура (довереник: показалка; поискване: PRequest; Var отговор: PReply);

TConfigProc = процедура (defcfg: PSysConfig; Var конфигурационния: указател);

TSaveLoadProc = процедура (inifile: указател; Var конфигурационния: указател);

// Информация за индивидуална приставка

Име: shortstring; // Пълното име

Име на файл: shortstring; // Име на файла

Дръжка: цяло число; // Дръжка зарежда DLL

CFGSize: цяло число; // конфигурация размер в RAM

// Списък на заредени приставки







pgetn: TGetNProc; pgets: TGetSProc; плъгин: PPlugin;

// Прочетете плъгини и да създадете списък с тях.
Модули: = TPlugins.Create;
ако FindFirst ( '* .dll файл ", faAnyFile, SR)<> 0 след това да започне

ShowMessage ( "Не е намерен плъгини. ');

Основното, което трябва да имате предвид при проектирането на DLL - не трябва да позволява на ситуация, в която всяко изключение ще остане незабелязана (благодарение Пат Ричи в такива мъдри съвети). Тялото на изнесените функции "обвива" всички блокове try..except (което значително преработен Г.

Надявам се, че имате тези две малки линии в основните модули на вашия DLL (ако той не съдържа боравенето прекъсване): (* правят фиксирани сегменти DLL роуминг на данни *) GlobalPageUnlock (DSeg); GlobalReAlloc (DSeg, 0, GMEM_MODIFY или GMEM_MOVEABLE); Ако не се постави маркировка.

Споделянето на файлове област на дисплея (Memory сподели прикачени файлове). Вижте следния код: Var HMapping: THandle; PMapData: Стрелката; конст MAPFILESIZE = 1000; процедура OpenMap; Var llInit: булева; Платът: цяло число; започне HMapping: = CreateFileMapping ($ FFFFFFFF, нула, PAGE_READWRITE, 0, MAPFI.

Как да затворя досие, открито в DLL (създаден в Делфи), и призова от VB? Това е известен проблем. Това идва от факта, че VB се затваря, когато използвате DOS-5 стандартни описания (0..4). Например, една програма за отваряне на файл, повторното използване на тези описания на първия отворен Fi.

Проблемът е по-скоро за един хакер, а не програмист. Но има ситуации, когато това е необходимо. Трудно е да си представим ситуация, в която може да бъде полезно, но например, може да прихване изморителната необходимостта да се купят кутия :) компонента. Разбира се, този код е предназначен за по-широко.