zoukankan      html  css  js  c++  java
  • 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.
     
  • 相关阅读:
    循环链表版本-----约瑟夫环
    插入排序
    队列的模板
    数据结构-栈-进制转换
    括号匹配
    两个有序链表合成一个有序链表
    希尔排序
    java-MD5-加密
    java使用Test测试接口类
    将将List json 转成List<?>实体
  • 原文地址:https://www.cnblogs.com/tc310/p/4680693.html
Copyright © 2011-2022 走看看