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

相关文章

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

在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