FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice

news2025/2/28 17:03:04

前几篇笔记习练了IIS soapis30配置、VB6 webservice创建、Delphi7和VB6 webservice访问:

VB6 COM webservice发布,VB.NET和Delphi 7 对webservice访问,及MS Soap Toolkit 3.0在IIS上的ISAPI配置_Mongnewer的博客-CSDN博客

本篇笔记重点编写 Delphi7 DLL 对MS soap3 进行封装,让FreeBASIC通过Delphi7的DLL封装,访问IIS上的Webservice。

主要任务是:1. 编写 Delphi7 DLL, 2. 编写FreeBasic调用程序。

  • 编写 Delphi7 DLL

打开Delphi7 , File -> New -> others -> DLL wizard

在创建的DLL项目Project2上引入 Microsoft Soap Type Library v3.0(Version 3.0)

在Project2.pas中use引用的 MSSOAPLib30_TLB

编写三个function,一个是初始化dpSoap3Init、一个是dpEchoString、一个是dpAddNumbers,全部程序如下:

library Project2;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  StrUtils,
  COMobj,
  MSSOAPLib30_TLB in 'C:\Program Files (x86)\Borland\Delphi7\Imports\MSSOAPLib30_TLB.pas';

type
  TinRecord = record
  vi_param1: short;
  vi_param2: short;
End;

var
    mySoapClient3: OleVariant;

function dpSoap3Init(): integer; stdcall;
    begin
        try
        mySoapClient3:= CreateOleObject('MSSOAP.SoapClient30');
        mySoapClient3.mssoapinit('http://192.168.3.113/Soap3DocSamples/DocSample1/Server/TestWEBservice.WSDL', 'TestWEBservice', 'Sample1SoapPort');
        Result:= 0;
        except
        Result:= 1;
        end;
    end;

function dpEchoString(inChars: pchar): pchar; stdcall;
    var
      I: integer;
      fromFBstring: string;
      fromWSDLstring: string;
      p: pchar;
    begin
        fromFBstring:='';
        for I:=0 to 255 do
            begin
              fromFBstring:= fromFBstring + inChars^;
              inc(inChars);
            end;
        fromFBstring:= Trim(fromFBstring);
        fromWSDLstring:= mySoapClient3.EchoString(fromFBstring);

        p:= pchar(fromWSDLstring);
        Result:= p;
    end;

function dpAddNumbers(inType: Pointer): smallint;
    var
      nBlock: TinRecord;
    begin
        CopyMemory(@nBlock, inType, sizeof(nBlock));
        Result:= mySoapClient3.AddNumbers(nBlock.vi_param1, nBlock.vi_param2);
    end;

exports
dpSoap3Init,
dpEchoString,
dpAddNumbers;

{$R *.res}

begin

end.

写好代码,然后编译生成 Project.DLL,放到FreeBasic项目的Release下(后面会进一步讲到)。

接下来,创建FreeBASIC标准32位x86窗体项目,放上一些控件,并在窗体通用中放入代码 Dim Shared library As Any Ptr, 这个library将作为动态装入Project2.DLL的指针,供整个程序运行期使用。

在窗体Create创建时,动态调入Project2.DLL,这个DLL要放在工程的 Release下面,与工程的exe放在一起。调入Project2.DLL后取得指针 library,利用指针找到 dpSoap3Init 过程入口地址,然后调用它,并在Text1中显示调用结果,为0表示成功,为1表示失败。

Sub Form1_WM_Create(hWndForm As hWnd, UserData As Integer)
   library = DyLibLoad("Project2") '就文件名,不能带 .DLL 
   If (library = 0) Then
      AfxMsg "加载DLL失败"
      Return
   End If
   
   Dim retVal As Integer 
   Dim FuncSoap As Function() As Integer
   FuncSoap = DyLibSymbol(library, "dpSoap3Init")
   If (FuncSoap = 0) Then
      AfxMsg "无法从开发DLL例题库中检索dpSoap3Init()函数的地址"
      Return
   End If
   
   retVal = FuncSoap()
   Text1.text = Str(retVal)      'Should be 0 if success
End Sub

当项目运行结束时,释放 Project2.DLL,此时会用到 library 指针。

Function Form1_WM_Close(hWndForm As hWnd) As LResult
   DyLibFree(library)
   Function = False ' 返回 TRUE 阻止关闭窗口。
End Function

dpEchoString的实现。找到dpEchoString函数入口,将字符数组的首地址交给它,然后取得返回的字符数组的首地址。依据返回的首地址,变回Project.DLL发送出来的完整字符串。字符数组长度为256,足以满足使用要求。

   '===============================================================================================   
   Dim fHello As Function(ByVal As UByte Ptr) As UByte Ptr
   fHello = DyLibSymbol(library, "dpEchoString")
   
   If (fHello = 0) Then
      AfxMsg "无法从开发DLL例题库中检索dpEchoString()函数的地址"
      Return
   End If
   
   Dim I As Integer
   Dim J As UByte Ptr
   Dim sTempString As String
   Dim sParam(255) As UByte
   
   sTempString = Trim(Text6.text) & " "
   memcpy(@sParam(0), StrPtr(sTempString), Len(sTempString))
   J= fHello(@sParam(0))
      
   sTempString = ""
   For I = 0 To 255
      sTempString = sTempString + Chr(*(J+I))
   Next I
   Text3.text = Trim(sTempString)

再看一下Project2.DLL中对应的代码,它接收来自FreeBASIC的指针,变成字符串后发送给MS Soap Toolkit3的SoapClient3实例mySoapClient3,并接收它返回的字符串,其pchar指针返回给FreeBASIC

function dpEchoString(inChars: pchar): pchar; stdcall;
    var
      I: integer;
      fromFBstring: string;
      fromWSDLstring: string;
      p: pchar;
    begin
        fromFBstring:='';
        for I:=0 to 255 do
            begin
              fromFBstring:= fromFBstring + inChars^;
              inc(inChars);
            end;
        fromFBstring:= Trim(fromFBstring);
        fromWSDLstring:= mySoapClient3.EchoString(fromFBstring);

        p:= pchar(fromWSDLstring);
        Result:= p;
    end;

dpAddNumbers调用使用了变量结构体,取得dpAddNumbers地址后通过它发送结构的地址指针,并在函数返回时获得16位short类型数据值。

   Type TParam1
      vi_Param1 As Short
      vi_Param2 As Short
   End Type
   
   Dim fAddNumbers As Function(ByVal As Any Ptr) As Short
   fAddNumbers = DyLibSymbol(library, "dpAddNumbers")
   
   If (fAddNumbers = 0) Then
      AfxMsg "无法从开发DLL例题库中检索dpAddNumbers()函数的地址"
      Return
   End If
   
   Dim Resultval As Short
   Dim nParam1 As TParam1
   nParam1.vi_Param1 = Val(Text4.text): nParam1.vi_Param2 = Val(Text5.text)
   Resultval = fAddNumbers(@nParam1)
   Text2.text = Str(Resultval)

在Project2.DLL中,也使用了一个定义好的结构体TinRecord。当收到FreeBASIC的结构体指针后,直接将其指向的内容复制给TinRecord结构体实例,然后直接将结构体中的变量发送给mySoapClient3,并将返回的结果返送给FreeBASIC

function dpAddNumbers(inType: Pointer): smallint;
    var
      nBlock: TinRecord;
    begin
        CopyMemory(@nBlock, inType, sizeof(nBlock));
        Result:= mySoapClient3.AddNumbers(nBlock.vi_param1, nBlock.vi_param2);
    end;
type
  TinRecord = record
  vi_param1: short;
  vi_param2: short;
End;

至此,FreeBASIC通过Delphi7 DLL顺利访问IIS的VB6 webservice

FreeBASIC有个开发中的axSuite是做COM访问的,我还没有试用过。这篇笔记只是针对MS Soap Toolkit 3.0的习练。

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

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

相关文章

IIS短文件名泄露漏洞复现

IIS短文件名泄露漏洞复现 前言一、漏洞描述二、漏洞原理1.什么是短文件2.短文件特征 三、漏洞验证三、漏洞防御总结 前言 IIS短文件名泄露漏洞比较老了,而且只适合于windowsiisasp的网络结构,所有如下的复现步骤看下就行了,关键是要弄懂原理…

钉钉(自建应用)无需代码连接畅捷通T+Cloud的方法

1 使用场景 企业日常工作中,经常会涉及到各种各样的订单审批流程,为了提高工作效率,大多数企业内部会选择畅捷通TCloud作为财务ERP系统,钉钉作为OA审批系统。为了保证流程的顺畅和高效,需要将畅捷通TCloud创建的销售单…

opencv基础: 视频,摄像头读取与保存的常用方法

当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。 VideoCapture 方法 cv2.VideoCapture();cv2.VideoCapture( device);cv2.VideoCapture(filename);上面有三种构造方法, 第一种是无法构造方法。 第二种参数device是一个数字。 …

F#奇妙游(30):计算表达式与ADT

Computation Expression More F#中自定义的 Computation Expression 一共有8个语法构造,其中match!是let!的语法糖。 在前面的一个帖子里CE初探我们已经介绍了 computation expression 中的绑定和返回,语法是let!和return。通过使用这两个语法&#xff…

浅谈 Spring AOP

AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理。⽐如⽤户登录权限的效验,没学 AOP 之前,我们所有需要判断⽤户登录的⻚⾯(中的⽅法&…

ipad必须要配原装的笔么?电容笔性价比高的品牌

众所周知,由于Apple pencil的出现,现在网上越来越多平替触控笔的出现,无论是价格和功能,几乎都很接近。很多小伙伴不知如何下手,不知道如何从众多品牌中挑选出适合自己的,今天我为大家总结几款好用平价电容…

Baklib:2023年企业知识库的新最好选择!

传统的企业知识管理方式主要是通过文件档案、会议记录、员工手册等方式来进行知识管理。这种方式的缺点是效率低下,信息不够及时、准确、全面,而且很难达到知识共享的效果。随着信息技术的发展,现代化的企业知识管理方式越来越受到企业的青睐…

骨传导耳机佩戴舒适吗?盘点骨传导耳机舒适度比较好的几款耳机!

相信很多年轻人和我一样,佩戴耳机成了日常的习惯,蓝牙耳机已经融入了我们的日常生活和工作。但长期戴耳机也有很多的问题存在,比如长时间佩戴导致耳道疼痛、甚至头痛,或是耳机隔音效果太好,导致错过身边的重要信息&…

记录aardio和Pythonl联动,为python做界面、做单exe文件的几个知识点

关于aardio的几个目录的说明 如果要aardio创建python关联程序,强烈建议新建工程向导中选择“窗口程序”+python来生成,会自动建立好目录,十分方便。 写好的python脚本或工程,直接放到py目录中,aardio中可以直接import导入该目录中的python模块,无需带目录,类似: aar…

实战ResNet:CIFAR-10数据集分类

本节将使用ResNet实现CIFAR-10数据集的分类。 7.2.1 CIFAR-10数据集简介 CIFAR-10数据集共有60 000幅彩色图像,这些图像是3232像素的,分为10类,每类6 000幅图,如图7-9所示。这里面有50 000幅图用于训练,构成了5个训…

概念:推理 训练 模型

训练 训练是通过从已有的数据中学习到某种能力; 推理 推理是简化并使用该能力,使其能快速、高效地对未知的数据进行操作,以获得预期的结果。 模型 训练是计算密集型操作,模型一般都需要使用大量的数据来进行训练,通…

婚恋相亲交友红娘小程序源码开发搭建方法

目前婚恋市场基本处于兵家必争之地,从一二线城市到四五线城市单身男女多,传统婚恋相亲很多已经不满足现在年轻人市场,因此我们推出婚恋相亲交友小程序。 注意:小程序过审需ICP经营许可证。 程序支持多端:H5端、小程序…

go开发之个微机器人的二次开发

请求URL: http://域名/addRoomMemberFriend 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是String登录实例标识chatRoom…

国家网络安全周2023时间是什么时候?有什么特点?谁举办的?

国家网络安全周2023时间是什么时候? 2023年国家网络安全宣传周将于9月11日至17日在全国范围内统一开展。其中开幕式等重要活动将在福建省福州市举行。今年网安周期间,除开幕式外,还将举行网络安全博览会、网络安全技术高峰论坛、网络安全微视…

计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

SpringMVC的增删改查的案例

目录 前言: 1.总体思路: 2.前期准备 3.前台页面 前言: 我们今天来学习研究SpringMVC的增删改查,希望这篇博客能够帮助正在学习,工作的你们!!! 1.总体思路: 首先我们得…

在linux上挂载windows共享目录

挂载要求 非root用户(普通用户)能够读写windows共享目录,比如查看文件、创建文件、修改文件、删除文件 # 让普通用户也可以正常读写 uidvalue and gidvalue Set the owner and group of the root of the file system (default: uidgid0, bu…

《算法竞赛·快冲300题》每日一题:“附近的牛”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 附…

学习笔记——Java入门第三季

1.1 Java异常简介 异常:有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域。 异常处理:将出现的异常提示给编程人员与用户,使原本将要中断的程序继续运行或者退出。并且能够保存数据和释放资源…

独家!网络机顶盒什么牌子好?热门网络电视机顶盒排名TOP5

电视机搭配网络机顶盒看剧是很多人的消遣方式,不过在挑选网络机顶盒时很多人踩过雷,像卡顿、死机、广告多等问题频发,近来很多人咨询我网络机顶盒什么牌子好,我以销量为基础盘点了网络电视机顶盒排名,哪些品牌最受欢迎…