⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clsloaddll.~pa

📁 自已写的IP扫描工具
💻 ~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 + -