Delphi静态加载DLL和动态加载DLL示例

下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL.

直接上代码。

1、静态加载示例

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnEnableTouch: TButton;
    btnDisEnableTouch: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    procedure btnEnableTouchClick(Sender: TObject);
    procedure btnDisEnableTouchClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

{ 声明一个回调函数类型 }
type
  XTOUCH_ENUM_CALLBACK_PROC = function(pContext:Pointer;szSymbloicName:PChar;nType:Word):Boolean;stdcall;

function EnumerateTouchInstance(hWnd:THandle;pContext:Pointer;pCallback:XTOUCH_ENUM_CALLBACK_PROC):DWORD;stdcall;external 'xtkutility.dll';
//功能:枚举系统中的所有触摸设备

function CreateDevice(szSymbolicName: PChar): THandle;stdcall;external 'xtkutility.dll';
//打开触摸设备
function CloseDevice(hFile: THandle): Boolean;stdcall;external 'xtkutility.dll';
//关闭触摸设备
procedure EnableTouch(hFile: THandle;bEnable: Boolean);stdcall;external 'xtkutility.dll';
//触摸控制 bEnable为true时允许触摸  bEnable为false时禁止触摸

function DisEnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
//声明一个回调函数,禁止触摸所有触摸设备
function EnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
//声明一个回调函数,允许触摸所有触摸设备
var
  Form1: TForm1;

implementation

{$R *.dfm}
function DisEnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
var
  hDevice: THandle;
begin
  hDevice := CreateDevice(szSymbloicName);
  EnableTouch(hDevice,False);
  CloseDevice(hDevice);
  Result := True;
  //显示触摸设备标识符
  form1.Memo1.Clear;
  Form1.Memo1.Lines.Add(szSymbloicName);
end;

function EnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
var
  hDevice: THandle;
begin
  hDevice := CreateDevice(szSymbloicName);
  EnableTouch(hDevice,True);
  CloseDevice(hDevice);
  Result := True;
  //显示触摸设备标识符
  form1.Memo1.Clear;
  Form1.Memo1.Lines.Add(szSymbloicName);
end;
procedure TForm1.btnEnableTouchClick(Sender: TObject);
var
  dwNumsOfDevices: Word;
begin
  dwNumsOfDevices := EnumerateTouchInstance(0, nil , EnableTouchscreenCallback);
end;

procedure TForm1.btnDisEnableTouchClick(Sender: TObject);
var
  dwNumsOfDevices: Word;
begin
  dwNumsOfDevices := EnumerateTouchInstance(0, nil , DisEnableTouchscreenCallback);
end;

end.
 

2、动态加载示例

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnEnableTouch: TButton;
    btnDisEnableTouch: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    procedure btnEnableTouchClick(Sender: TObject);
    procedure btnDisEnableTouchClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

{ 声明一个回调函数类型 }
type
  XTOUCH_ENUM_CALLBACK_PROC = function(pContext:Pointer;szSymbloicName:PChar;nType:Word):Boolean;stdcall;   

  procedure loadDll(dllName: PChar);
  function DisEnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
  //声明一个回调函数,禁止触摸所有触摸设备
  function EnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
  //声明一个回调函数,允许触摸所有触摸设备



//动态调用dll
type
  TEnumerateTouchInstance = function(hWnd:THandle;pContext:Pointer;pCallback:XTOUCH_ENUM_CALLBACK_PROC):DWORD;stdcall;
  TCreateDevice = function(szSymbolicName: PChar): THandle;stdcall;
  TCloseDevice = function(hFile: THandle): Boolean;stdcall;
  TEnableTouch = procedure(hFile: THandle;bEnable: Boolean);stdcall;

var
  Form1: TForm1;
  DllHandle: THandle;
  EnumerateTouchInstance: TEnumerateTouchInstance;
  CreateDevice: TCreateDevice;
  CloseDevice: TCloseDevice;
  EnableTouch: TEnableTouch;
  
implementation

{$R *.dfm}

procedure loadDll(DllName: PChar);
begin
  try
    if FileExists(DllName) then
    begin
      DllHandle := LoadLibrary(DllName);
      if DllHandle = 0 then
      begin
        raise Exception.Create('加载dll文件:' + DllName + '失败!');
      end
      else
      begin
        EnumerateTouchInstance := GetProcAddress(DllHandle,PChar('EnumerateTouchInstance'));
        if @EnumerateTouchInstance = nil then
          raise Exception.Create('定义函数EnumerateTouchInstance失败!');

        CreateDevice := GetProcAddress(DllHandle,PChar('CreateDevice'));
        if @CreateDevice = nil then
          raise Exception.Create('定义函数CreateDevice失败!');

        CloseDevice := GetProcAddress(DllHandle,PChar('CloseDevice'));
        if @CloseDevice = nil then
          raise Exception.Create('定义函数CloseDevice失败!');

        EnableTouch := GetProcAddress(DllHandle,PChar('EnableTouch'));
        if @EnableTouch = nil then
          raise Exception.Create('定义函数EnableTouch失败!');
      end;  
    end
    else
    begin
      ShowMessage(DllName + '不存在!');
    end;
  except
    on e: Exception do
    begin
      ShowMessage(e.Message);
    end;  
  end;
end;  
function DisEnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
var
  hDevice: THandle;
begin
  hDevice := CreateDevice(szSymbloicName);
  EnableTouch(hDevice,False);
  CloseDevice(hDevice);
  Result := True;
  //显示触摸设备标识符
  form1.Memo1.Clear;
  Form1.Memo1.Lines.Add(szSymbloicName);
end;

function EnableTouchscreenCallback(pContext:Pointer;szSymbloicName:PChar;nType:Word): Boolean;stdcall;
var
  hDevice: THandle;
begin
  hDevice := CreateDevice(szSymbloicName);
  EnableTouch(hDevice,True);
  CloseDevice(hDevice);
  Result := True;
  //显示触摸设备标识符
  form1.Memo1.Clear;
  Form1.Memo1.Lines.Add(szSymbloicName);
end;
procedure TForm1.btnEnableTouchClick(Sender: TObject);
var
  dwNumsOfDevices: Word;
begin
  //使所有触摸设备可以触摸
  dwNumsOfDevices := EnumerateTouchInstance(0, nil , EnableTouchscreenCallback);
end;

procedure TForm1.btnDisEnableTouchClick(Sender: TObject);
var
  dwNumsOfDevices: Word;
begin
  //使所有触摸设备不可触摸
  dwNumsOfDevices := EnumerateTouchInstance(0, nil , DisEnableTouchscreenCallback);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeLibrary(DllHandle);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  DllName: string;
begin
  DllName := ExtractFilePath(ParamStr(0)) + 'xtkutility.dll';
  loadDll(PChar(DllName));
end;

end.
 
原文地址:https://www.cnblogs.com/tc310/p/4680693.html