this.unituntDllManager;
واجهة
الاستخدامات
ويندوز، فئات، سيسوتيلس، نماذج؛
يكتب
EDllError=Class(Exception);
TDllClass=ClassofTDll;
TDll=Class;
TDllEvent=procedure(Sender:TObject;ADll:TDll)ofObject;
{TDllManager
أو تنزيل ملف Dll.
oإضافة اسم الملف TDll إلى اسم المستخدم، أو إضافة اسم المستخدم؛
oDelete 自动销毁TDll对象؛
}
TDllManager=فئة(TList)
خاص
FLock:TRTLCriticalSection;
FDllClass:TDllClass;
FOnDllLoad:TDllEvent;
FOnDllBeforeUnLoaded:TDllEvent;
functionGetDlls(constIndex:Integer):TDll;
functionGetDllsByName(constFileName:String):TDll;
محمي
الإجراء Notify(Ptr:Pointer;Action:TListNotification);override;
عام
builderCreate;
destructorDestroy;override;
functionAdd(constFileName:String):Integer;overload;
functionIndexOf(constFileName:String):Integer;overload;
functionRemove(constFileName:String):Integer;overload;
الإجراءLock;
الإجراءUnLock;
propertyDllClass:TDllClassreadFDllClasswriteFDllClass;
propertyDlls[constIndex:Integer]:TDllreadGetDlls;default;
propertyDllsByName[constFileName:String]:TDllreadGetDllsByName;
propertyOnDllLoaded:TDllEventreadFOnDllLoadwriteFOnDllLoad;
propertyOnDllBeforeUnLoaded:TDllEventreadFOnDllBeforeUnLoadedwriteFOnDllBeforeUnLoaded;
نهاية؛
{TDll
o قم بتحميل ملف Dll,Windows.HModule
o销毁时自动在المالك الرئيسي للمالك؛
قم بإلغاء تحديد تجاوز DoDllLoaded أو تجاوز DoDllUnLoaded؛
}
TDll=الفئة(TObject)
خاص
FOwner:TDllManager;
FModule:HMODULE;
اسم الملف:سلسلة؛
تصريح F: منطقي؛
الإجراءSetFileName(constValue:String);
functionGetLoaded:Boolean;
الإجراءSetLoaded(constValue:Boolean);
الإجراءSetPermit(constValue:Boolean);
محمي
الإجراءDoDllLoaded;virtual;
الإجراءDoBeforeDllUnLoaded;virtual;
الإجراءDoDllUnLoaded;virtual;
الإجراءDoFileNameChange;virtual;
الإجراءDoPermitChange;virtual;
عام
buildorCreate;virtual;
destructorDestroy;override;
functionGetProcAddress(constOrder:Longint):FARPROC;overload;
functionGetProcAddress(constProcName:String):FARPROC;overload;
propertyFileName:StringreadFFileNamewriteSetFileName;
propertyLoaded:BooleanreadGetLoadedwriteSetLoaded;
propertyOwner:TDllManagerreadFOwner;
propertyPermit:BooleanreadFPermitwriteSetPermit;
نهاية؛
تطبيق
{TDll}
builderTDll.Create;
يبدأ
FOwner:=nil;
اسم الملف:=´´;
FModule:=0;
FPermit:=True;
نهاية؛
destructorTDll.Destroy;
فار
مدير:TDllManager;
يبدأ
محملة:=خطأ؛
ifFOwner<>nilthen
يبدأ
//الحصول على أفضل النتائج
المدير:=المالك;
// قم بتنزيل برنامج TDllManager، قم بتنزيل الملف
//اطلب FOwner لا شيء؛<--اطلب من TDllManager.Notify قم بالتسجيل
// 才能确保正确.
FOwner:=nil;
Manager.Remove(Self);
نهاية؛
موروث؛
نهاية؛
functionTDll.GetLoaded:Boolean;
يبدأ
النتيجة:=FModule<>0;
نهاية؛
functionTDll.GetProcAddress(constOrder:Longint):FARPROC;
يبدأ
ifLoadedthen
النتيجة:=Windows.GetProcAddress(FModule,Pointer(Order))
آخر
riseEDllError.CreateFmt(´DoLoadbeforeGetProcAddressof%u´,[DWORD(Order)]);
نهاية؛
functionTDll.GetProcAddress(constProcName:String):FARPROC;
يبدأ
ifLoadedthen
النتيجة:=Windows.GetProcAddress(FModule,PChar(ProcName))
آخر
riseEDllError.CreateFmt(´DoLoadbeforeGetProcAddressof%s´,[ProcName]);
نهاية؛
الإجراءTDll.SetLoaded(constValue:Boolean);
يبدأ
ifLoaded<>Valuethen
يبدأ
ifnotValuethen
يبدأ
Assert(FModule<>0);
DoBeforeDllUnLoaded;
يحاول
FreeLibrary(FModule);
FModule:=0;
يستثني
Application.HandleException(Self);
نهاية؛
this.DoDllUnLoaded;
نهاية
آخر
يبدأ
FModule:=LoadLibrary(PChar(FFileName));
يحاول
Win32Check(FModule<>0);
DoDllLoaded;
يستثني
واحدE: استثناء
يبدأ
ifFModule<>0ثم
يبدأ
FreeLibrary(FModule);
FModule:=0;
نهاية؛
riseEDllError.CreateFmt(´LoadLibraryError:%s´,[E.Message]);
نهاية؛
نهاية؛
نهاية؛
نهاية؛
نهاية؛
الإجراءTDll.SetFileName(constValue:String);
يبدأ
ifLoadedthen
riseEDllError.CreateFmt(´DoUnloadbeforeloadanotherModulnamed:%s´,
[قيمة])؛
ifFFileName<>Valuethen
يبدأ
FFileName:=Value;
this.DoFileNameChange;
نهاية؛
نهاية؛
الإجراءTDll.DoFileNameChange;
يبدأ
//دونونثينغ.
نهاية؛
الإجراءTDll.DoDllLoaded;
يبدأ
إذا تم تعيينه (FOwner) وتم تعيينه (FOwner.OnDllLoaded) ثم
FOwner.OnDllLoaded(FOwner,Self);
نهاية؛
الإجراءTDll.DoDllUnLoaded;
يبدأ
//دونونثينغ.
نهاية؛
الإجراءTDll.DoPermitChange;
يبدأ
//دونونثينغ.
نهاية؛
الإجراءTDll.SetPermit(constValue:Boolean);
يبدأ
ifFPermit<>Valuethen
يبدأ
FPermit:=Value;
this.DoPermitChange;
نهاية؛
نهاية؛
الإجراءTDll.DoBeforeDllUnLoaded;
يبدأ
إذا تم تعيينه (FOwner) وتم تعيينه (FOwner.OnDllBeforeUnLoaded) ثم
FOwner.OnDllBeforeUnLoaded(FOwner,Self);
نهاية؛
{TDllManager}
functionTDllManager.Add(constFileName:String):Integer;
فار
دلل:تدلل؛
يبدأ
النتيجة:=-1؛
قفل؛
يحاول
ifDllsByName[FileName]=nilthen
يبدأ
Dll:=FDllClass.Create;
Dll.FileName:=FileName;
النتيجة:=Add(Dll);
نهاية
آخر
النتيجة:=-1؛
أخيراً
فتح؛
نهاية؛
نهاية؛
builderTDllManager.Create;
يبدأ
FDllClass:=TDll;
تهيئة CriticalSection(FLock);
نهاية؛
destructorTDllManager.Destroy;
يبدأ
حذف CriticalSection(FLock);
موروث؛
نهاية؛
functionTDllManager.GetDlls(constIndex:Integer):TDll;
يبدأ
قفل؛
يحاول
إذا (الفهرس> = 0) و (الفهرس <= العد -1) ثم
النتيجة:=العناصر[الفهرس]
آخر
riseEDllError.CreateFmt(´ErrorIndexofGetDlls,Value:%d,TotalCount:%d´,[Index,Count]);
أخيراً
فتح؛
نهاية؛
نهاية؛
functionTDllManager.GetDllsByName(constFileName:String):TDll;
فار
أنا:عدد صحيح؛
يبدأ
قفل؛
يحاول
I:=IndexOf(FileName);
إذا أنا> = 0 ثم
النتيجة:=Dlls[I]
آخر
النتيجة: = لا شيء؛
أخيراً
فتح؛
نهاية؛
نهاية؛
functionTDllManager.IndexOf(constFileName:String):Integer;
فار
أنا:عدد صحيح؛
يبدأ
النتيجة:=-1؛
قفل؛
يحاول
forI:=0toCount-1do
ifCompareText(FileName,Dlls[I].FileName)=0ثم
يبدأ
النتيجة:=أنا؛
استراحة؛
نهاية؛
أخيراً
فتح؛
نهاية؛
نهاية؛
الإجراءTDllManager.Lock;
يبدأ
OutputDebugString(Pchar(´TRLockDM´+IntToStr(GetCurrentThreadId)+´:´+IntToStr(DWORD(Self))));
EnterCriticalSection(FLock);
OutputDebugString(Pchar(´LockedDM´+IntToStr(GetCurrentThreadId)+´:´+IntToStr(DWORD(Self))));
نهاية؛
الإجراءTDllManager.Notify(Ptr:Pointer;Action:TListNotification);
يبدأ
ifAction=lnDeletedthen
يبدأ
//若TDll(Ptr).المالك والشخصية،则
// قم بتنزيل TDll.Destroy قم بتنزيله؛
ifTDll(Ptr).Owner=Selfthen
يبدأ
//المالك لا يملك أي شيء
TDll(Ptr).DoBeforeDllUnLoaded;
TDll(Ptr).FOwner:=nil;
TDll(Ptr).Free;
نهاية؛
نهاية
آخر
ifAction=lnAddedthen
TDll(Ptr).FOwner:=Self;
موروث؛
نهاية؛
functionTDllManager.Remove(constFileName:String):Integer;
فار
أنا:عدد صحيح؛
يبدأ
النتيجة:=-1؛
قفل؛
يحاول
I:=IndexOf(FileName);
إذا أنا> = 0 ثم
النتيجة: = إزالة (Dlls[I])
آخر
النتيجة:=-1؛
أخيراً
فتح؛
نهاية؛
نهاية؛
الإجراءTDllManager.UnLock;
يبدأ
LeaveCriticalSection(FLock);
OutputDebugString(Pchar(´UnLockDM´+IntToStr(GetCurrentThreadId)+´:´+IntToStr(DWORD(Self))));
نهاية؛
نهاية.