Как се работи с плъгини - всичко за него, и програмиране
Аз направих така - за да изберете всички 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.
Проблемът е по-скоро за един хакер, а не програмист. Но има ситуации, когато това е необходимо. Трудно е да си представим ситуация, в която може да бъде полезно, но например, може да прихване изморителната необходимостта да се купят кутия :) компонента. Разбира се, този код е предназначен за по-широко.