DLL的另类调用

2024-04-13 07:48
文章标签 dll 调用 另类

本文主要是介绍DLL的另类调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

优点:

1.使用静态调用,无动态库时系统完全无法运行

2.速度比动态调用快

 

unit uTestDLLBase;

interface
uses Windows, Classes, Messages, StdCtrls, SysUtils;

const
  cTestDLLName = 'Test.dll';

type
  //定义函数类型
  TAdd = function (AInt1,AInt2:Integer):Integer; stdcall;
  TLev = function (AInt1,AInt2:Integer):Integer; stdcall;

  //封装接口类
  TTestClass = class
  private
  public
    function _Add(AInt1,AInt2:Integer):Integer;
    function _Lev(AInt1,AInt2:Integer):Integer;
  end;

var
  TestClass:TTestClass = nil;
  //加载动态库
  function LoadDLL:Boolean;
  function DLLLoaded:Boolean;
  //卸载动态库
  procedure UnLoadDLL;
implementation
var
  //动态库句柄
  hDLLHandle:THandle = 0;
  Add:TAdd;
  Lev:TLev;

function LoadDLL:Boolean;
begin
  if hDLLHandle = 0 then
    hDLLHandle := LoadLibrary(cTestDLLName);
  Result := hDLLHandle <> 0;
end;

function DLLLoaded:Boolean;
begin
  Result := hDLLHandle <> 0;
end;

type
  //定义结构类型
  TTestStubRec = record
    StubProc:Pointer;
    ProcVar:PPointer;
    Name:PChar;
  end;

  function CallStubFunc(AIndex:Integer):Pointer; forward;
  procedure Lpfn_Add; asm mov eax, 0; call CallStubFunc; jmp eax; end;
  procedure Lpfn_Lev; asm mov eax, 1; call CallStubFunc; jmp eax; end;

const
  cEntryCount = 2;
  EntryFuncArr : array[0..cEntryCount-1] of TTestStubRec = (
  (StubProc:@Lpfn_Add;ProcVar:@@Add;Name:PChar('Add')),
  (StubProc:@Lpfn_Lev;ProcVar:@@Lev;Name:PChar('Lev')));

function CallStubFunc(AIndex:Integer):Pointer;
begin
  with EntryFuncArr[AIndex] do
  begin
    Result := GetProcAddress(hDLLHandle,Name);
    ProcVar^ := Result;
  end;
end;

procedure InitEntryStub;
var
  i:Integer;
begin
  for i := 0 to cEntryCount-1 do
    with EntryFuncArr[i] do
      ProcVar^ := StubProc;
end;

procedure UnLoadDLL;
var
  hTmpHandle:THandle;
begin
  hTmpHandle := InterlockedExchange(Integer(hDLLHandle),0);
  if hTmpHandle <> 0 then
  begin
    FreeLibrary(hTmpHandle);
    InitEntryStub;
  end;
end;


{ TTestClass }

function TTestClass._Add(AInt1, AInt2: Integer): Integer;
begin
  Result := Add(AInt1,AInt2);
end;

function TTestClass._Lev(AInt1, AInt2: Integer): Integer;
begin
  Result := Lev(AInt1,AInt2);
end;

initialization
  InitEntryStub;
finalization
  UnLoadDLL;
end.

 

这篇关于DLL的另类调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899547

相关文章

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

电脑提示msvcp90.dll缺少怎么办? MSVCP90.dll文件丢失的修复方法

《电脑提示msvcp90.dll缺少怎么办?MSVCP90.dll文件丢失的修复方法》今天我想和大家分享的主题是关于在使用软件时遇到的一个问题——msvcp90.dll丢失,相信很多老师在使用电脑时... 在计算机使用过程中,可能会遇到 MSVCP90.dll 丢失的问题。MSVCP90.dll 是 Mic

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音