Delphi Http Https 最好的解决方法(三) LoadLibrary扩展

news2024/11/19 15:12:40

开发环境: Delphi XE 10.1 Berlin

前提文章: Delphi Http Https 最好的解决方法(二)

目录

1. 项目描述

2. 问题描述

3. 解决方案

        3.1 主程序在导入dll方法单元处理(不推荐)

        3.2 在dll的工程文件处加入(不推荐)

        3.3 在dll的工程文件获取dll(HelpTool.dll)的当前路径(推荐方案)

4. 结语


1. 项目描述

        之前我关于http、https封装的dll(我用XE10.1编译,依赖10.1的libeay32.dll 和 ssleay32.dll)是运用于一个独立的exe程序,是没有问题的。可最近做一个银行转账的接口,需要在主程序的基础上进行集成,我查看主程序的应用目录已经存在 libeay32.dll 和 ssleay32.dll ,主程序是一个很庞大的HIS项目,我就担心集成(替换原相关dll)后会影响原系统相关功能。

2. 问题描述

        我编译了一个Demo程序模拟主程序,导入HelpTool.dll方法,其中我定义如下:

const
  dllName= '银企接口\app\HelpTool.dll';

        以及在该目录下创建【银企接口\app】目录,如下:

        

        银企接口目录下有一个app的文件夹,如下:

        

        我运行Demo程序“D6Demo.exe” 发起https请求,提示 Could not load SSL library

        我看libeay32.dll和ssleay32.dll是和HelpTool.dll同目录,怎么会提示这个错误。

        我猜测应该是路径的问题,然后我查看日志信息,发现HekpTool.dll里的日志

        竟然写在了exe目录的log目录下(应该是和dll同目录),初步确定是路径问题。

        原本我这样把exe和dll分离不同目录,也从没有搞过,就只有百度查找了。

        方案没找到,倒是找到了一个关键词"LoadLibrary", 赶紧试试看!

3. 解决方案

        3.1 主程序在导入dll方法单元处理(不推荐)

        在Demo程序dll导入接口添加如下代码,指定载入libeay32.dll 和 ssleay32.dll:

initialization
  LoadLibrary(Pchar('银企接口\app\libeay32.dll'));
  LoadLibrary(Pchar('银企接口\app\ssleay32.dll'));
finalization
  //

        使用Demo发起https请求成功. 这样将dll路径写死,不推荐这样操作.

        3.2 在dll的工程文件处加入(不推荐)

        在dll里指定载入libeay32.dll 和 ssleay32.dll

begin
  LoadLibrary(Pchar(TFilePath.AppPath+ '银企接口\app\libeay32.dll'));
  LoadLibrary(Pchar(TFilePath.AppPath+ '银企接口\app\ssleay32.dll'));
end.

        使用Demo发起https请求成功. 这样将dll路径写死,不推荐这样操作.

        3.3 在dll的工程文件获取dll(HelpTool.dll)的当前路径(推荐方案)

        之前在Demo的dll导入单元,已指定了HelpTool.dll的路径。那么在HelpTool.dll里,直接获取dll自身的路径,来导入libeay32.dll和ssleay32.dll。

        dll获取自身路径方法:

Function GetDllDir:string;
var
  ModuleName:string;
  I, iCnt: Integer;
  dllDir: string;
begin
  dllDir:= '';
  SetLength(ModuleName, 255);
  //取得Dll自身路径的目录
  GetModuleFileName(HInstance, PChar(ModuleName), Length(ModuleName));
  iCnt:= DataFJ(ModuleName, '\'); //最后一个就是文件名"HttpTool.dll"
  for I := 1 to iCnt- 1 do
  begin
    if dllDir<>'' then dllDir:= dllDir+ '\';
    dllDir:= dllDir+ arr_dir[I];
  end;
  Result := dllDir;
end;
function DataFJ(Cin: string; CS: string = '|'): Integer;
var
  i, j, jl1: integer;
begin
  Result := 1;
  jl1 := 1;
  j := 1;
  for i := Low(arr_dir) to High(arr_dir) do
    arr_dir[i] := '';
  for i := 1 to (length(Cin)) do
  begin
    if Cin[i] = CS then
    begin
      arr_dir[j] := copy(Cin, jl1, i - jl1);
      jl1 := i + 1;
      j := j + 1;
    end;
  end;
  arr_dir[j] := copy(Cin, jl1, i + 1 - jl1);
  Result := j;
end;

        在dll的工程文件加入如下代码:

var
  dllPath: string;

begin
  dllPath:= GetDllDir;
  LoadLibrary(Pchar(GetDllDir+ '\libeay32.dll'));
  LoadLibrary(Pchar(GetDllDir+ '\ssleay32.dll'));
end.

         使用Demo发起https请求成功!!!

4. 结语

        综合以上三种方案,结合自身项目开发方案,我选择第三种,当然,那种方便用哪种。

       

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitlab 安装到项目上传一篇解决

文章目录1.安装1.1创建挂载目录1.2启动1.3 配置gitlab查看docker admin 账户初始密码注册普通用户2.1进入注册2.2创建后通过登录admin审批3.2 步骤13.2 步骤23.3步骤33.4 项目添加成员4 使用成员用户,上传到新建的项目中4.1 复制项目地址4.2使用 git here 克隆项目4.3进入下载目…

读懂分布式事务

一、概述 1.1 什么是分布式事务 事务我们都很熟悉&#xff0c;事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 事务有四大特性&#xff1a; Atomic&#xf…

rabbitmq安装和thinkphp6简单操作思路

1、安装rabbitmq 2、crontab定时检测rabbtimq状态 2、使用thinphp6.0框架rabbitmq示例,supervisor守护消费者 3、RabbitMQ有四种交换机类型 rabbitmq组成部分如下&#xff1a; Broker&#xff1a;消息队列服务进程&#xff0c;此进程包括两个部分&#xff1a;Exchange和Que…

代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和

day4211.分割等和子集1.dp数组的含义2.确定递推公式3.dp数组初始化4.确定遍历顺序5.打印dp数组1049. 最后一块石头的重量 II1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组494. 目标和1.确定dp数组以及下标的含义2.确定递推公式3.…

Bootstrap系列之Flex布局

文章目录Bootstrap中的Flexd-flex与d-inline-flex也存在响应式变化flex水平布局flex垂直布局flex水平与垂直也存在响应式变化内容排列&#xff08;justify-content响应式变化也存在于这里sm&#xff0c;md&#xff0c;lg&#xff0c;xl&#xff09;子元素对齐方式Align items&a…

Oracle-00-卸载篇

这里给出企业级的Oracle 10g的卸教程,新安装的19c并没有正经去做卸载的操作,为了后面教程的进度,这里就先借用下10g,如果有需要会重新更新19c的卸载教程 windows服务中将Oracle所有服务全部停掉 选中Oracle - OraDb10g_home2->Oracle Installation Products->Univers…

文化:你所在的团队,有多少人敢讲真话?

你好&#xff0c;我是叶芊。 今天我们要讨论的话题是文化&#xff0c;说“文化”这个词你可能会觉得很虚&#xff0c;那我们换个词——“做事风格”&#xff0c;这就和你们团队平时的协作习惯密切相关了。 做事风格&#xff0c;往小了讲&#xff0c;会影响团队成员对开会的认知…

CV——day78 读论文:通过静态背景构建扩展低通道路边雷达的探测距离(目标是规避风险)

Extending the Detection Range for Low-Channel Roadside LiDAR by Static Background Construction 通过静态背景构建扩展低通道路边雷达的探测距离I. INTRODUCTIONII. RELATED WORKA. LiDAR-Based 3-D Vehicle and Road User DetectionB. LiDAR Data Background FilteringC.…

数据结构与算法之打家劫舍(一)动态规划思想

动态规划里面一部题目打家劫舍是一类经典的算法题目之一&#xff0c;他有各种各样的变式&#xff0c;这一篇文章和大家分享一下打家劫舍最基础的一道题目&#xff0c;掌握这一道题目&#xff0c;为下一道题目打下基础。我们直接进入正题。一.题目大家如果刚接触这样的题目&…

Linux小黑板(9):共享内存

"My poor lost soul"上章花了不少的篇幅讲了讲基于管道((匿名、命名))技术实现的进程间通信。进程为什么需要通信&#xff1f;目的是为了完成进程间的"协同",提高处理数据的能力、优化业务逻辑的实现等等&#xff0c;在linux中我们已经谈过了一个通信的大类…

数据库的基本查询

注意&#xff1a;LIMIT的两个参数&#xff0c;第一个是起始位置&#xff0c;第二个是一次查询到多少页。注意&#xff1a;什么类型的数字都是可以排序的。日期的降序是从现在到以前&#xff0c;MySQL ENUM值如何排序&#xff1f;在MYSQL中&#xff0c;我们知道每个ENUM值都与一…

安装MySQL数据库

安装MySQL数据库 获取软件&#xff1a;https://dev.mysql.com/downloads/mysql/ 下载完成后进行解压操作 若安装目录里没有my.ini配置文件&#xff0c;则需要新建一个my.ini的配置文件。 编辑my.ini配置文件&#xff0c;将配置文件中的内容修改成下面内容 [client] # 设置…

基于企业微信应用消息的每日早安推送

基于企业微信应用消息的每日早安推送 第一步&#xff1a;注册企业微信 企业微信注册地址&#xff1a;https://work.weixin.qq.com/wework_admin/register_wx 按照正常流程填写信息即可&#xff0c;个人也可以注册企业微信&#xff0c;不需要公司 注册完成后&#xff0c;登录…

户籍管理系统测试用例

目录 一、根据页面的不同分别设计测试用例 登录页面 用户信息列表 用户编辑页面 用户更新页面 二、根据目的不同分别设计测试用例 一、根据页面的不同分别设计测试用例 上图是针对一个网站的测试&#xff0c;按照页面的不同分别来设计对应的测试用例。 登录页面 用户信息列…

[MySQL]MySQL数据类型

文章目录数据类型分类数值类型tinyint类型bit类型float类型decimal类型字符串类型char类型varchar类型char和varchar对比日期和时间类型enum和set类型数据类型分类 MySQL中&#xff0c;支持各种各样的类型&#xff0c;比如表示数值的整型浮点型&#xff0c;文本、二进制类型、…

【密码学】 一篇文章讲透数字签名

【密码学】 一篇文章讲透数字签名 数字签名介绍 数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&#xff0c;这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名…

问题解决:Excel中依据某一列数据进行匹配

问题描述Excel处理时&#xff0c;常常需要从一个大表里&#xff0c;按照条件提取子集。需要我们按照某一序列为标准&#xff0c;匹配筛选出有效信息&#xff0c;案例如下&#xff1a;依据名称匹配销售额。解决方法使用函数&#xff1a;VLOOKUP(lookup_value,table_array,col_in…

Elasticsearch7.8.0版本进阶——自定义分析器

目录一、自定义分析器的概述二、自定义的分析器的测试示例一、自定义分析器的概述 Elasticsearch 带有一些现成的分析器&#xff0c;然而在分析器上 Elasticsearch 真正的强大之 处在于&#xff0c;你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单 …

刚来的薪资20k,是我的2倍,我是真的卷不过,真的太变态了

在这个行业爬摸滚打5年了&#xff0c;从最开始点点点的功能测试到现在到现在成为高级测试&#xff0c;工资也翻了几倍&#xff0c;简单的说几句吧 改变的开始 之所以改变的原因很简单&#xff0c;我快被新来的卷死了&#xff0c;新来的本科是某211的&#xff0c;干劲十足&…

Python为CANoe工程添加/删除DBC文件

前面文章我们对于通过COM来实现打开CANoe、导入CANoe配置工程、导入执行文件、启动CANoe软件和执行脚本;但是这只能完成最基本的功能调用,在实际得到使用过程中,特别是各家在推的CI/CD以及平台化,仅仅是实现这些功能是完全不够用的;比如dbc的添加和删除,这是我们非常必要…