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

相关文章

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name