📄 clsloaddll.~pa
字号:
{*******************************************************************************
Unit description: class for Load DLL
Developer: cy Date: 2003/03/22
Modifier: cy Date: 2003/03/25
Modifier: mjg Date: 2003/10/15
Coding standard version NO. :1.0
Copyright(C)SCM ,All right reserved
*******************************************************************************}
unit clsLoadDLL;
interface
uses
SysUtils, Forms, Windows, clsGlobal, Classes;
type
EDLLLoadError = class(Exception);
{Type for dynamical loading DLL}
TCallDLL = function(AobjGlobal: TGlobal): TForm; stdcall;
{Set old Applicaton Var in Dll }
TSetDLL = procedure; stdcall;
TLoadDLL = class(TObject)
private
{ Private declarations }
public
{ Public declarations }
DLLForm: TForm;
CallDLL: TCallDLL;
SetDLL: TSetDLL;
iDLL: hwnd;
constructor Create;
destructor Destroy; override;
end;
function CreateobjLoadDLL(ADLLNameList: TStringList; ADLLName: string): Boolean;
procedure LoadDLL(ADLLNameList: TStringList; PFormFreeCallBack: Pointer; const ADLLName: string);
var
objLoadDLL: TLoadDLL;
implementation
function CreateobjLoadDLL(ADLLNameList: TStringList; ADLLName: string): Boolean;
begin
Result := false;
if ADLLNameList.IndexOf(ADLLName) < 0 then exit;
if ADLLNameList.Objects[ADLLNameList.IndexOf(ADLLName)] = nil then
begin
objLoadDLL := TLoadDLL.Create;
ADLLNameList.Delete(ADLLNameList.IndexOf(ADLLName));
ADLLNameList.AddObject(ADLLName, objLoadDLL);
end;
Result := True;
end;
constructor TLoadDLL.Create;
begin
inherited;
iDLL := 0;
end;
destructor TLoadDLL.Destroy;
begin
if Assigned(DLLForm) then DLLForm.Free;
inherited;
end;
procedure LoadDLL(ADLLNameList: TStringList; PFormFreeCallBack: Pointer; const ADLLName: string);
var
LastError: DWord;
begin
try
with TLoadDLL(ADLLNameList.Objects[ADLLNameList.IndexOf(Trim(ADLLName))]) do
begin
if iDLL = 0 then
begin
iDLL := LoadLibrary(PChar(Trim(ADLLName) + '.dll'));
if iDLL = 0 then
begin
LastError := GetLastError;
raise EDLLLoadError.create(IntToStr(LastError) + ': Unable to load ' + Trim(ADLLName) + '.dll');
end;
CallDLL := GetProcAddress(iDLL, 'CallDLL');
if @CallDLL = nil then
begin
LastError := GetLastError;
raise EDLLLoadError.create(IntToStr(LastError) + ': Unable to find function CallDLL');
end;
SetDLL := GetProcAddress(iDLL, 'SetDLL');
if @SetDLL = nil then
begin
LastError := GetLastError;
raise EDLLLoadError.create(IntToStr(LastError) + ': Unable to find function SetDLL');
end;
end;
if not Assigned(DLLForm) then
begin
objGlobal.PFormFreeCallBack := PFormFreeCallBack;
objGlobal.gCallType := 1;
DLLForm := CallDLL(objGlobal);
end;
DLLForm.Show;
DLLForm.WindowState := wsNormal;
end;
except
if Assigned(TLoadDLL(ADLLNameList.Objects[ADLLNameList.IndexOf(Trim(ADLLName))])) then
TLoadDLL(ADLLNameList.Objects[ADLLNameList.IndexOf(Trim(ADLLName))]).Free;
ADLLNameList.Delete(ADLLNameList.IndexOf(Trim(ADLLName)));
ADLLNameList.Add(Trim(ADLLName));
raise;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -