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

这篇具有很好参考价值的文章主要介绍了FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice,FreeBASIC web服务,Delphi7 web服务封装,IIS VB6 web服务

前几篇笔记习练了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

FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice,FreeBASIC web服务,Delphi7 web服务封装,IIS VB6 web服务

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

FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice,FreeBASIC web服务,Delphi7 web服务封装,IIS VB6 web服务

在Project2.pas中use引用的 MSSOAPLib30_TLB

FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice,FreeBASIC web服务,Delphi7 web服务封装,IIS VB6 web服务

编写三个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:= StrPas(inChars);
        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的指针,供整个程序运行期使用。

FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice,FreeBASIC web服务,Delphi7 web服务封装,IIS VB6 web服务

在窗体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通过Delphi7 DLL调用MS SOAP使用VB6 Webservice,FreeBASIC web服务,Delphi7 web服务封装,IIS VB6 web服务

FreeBASIC有个开发中的axSuite是做COM访问的,我还没有试用过。这篇笔记只是针对MS Soap Toolkit 3.0的习练。文章来源地址https://www.toymoban.com/news/detail-701888.html

到了这里,关于FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DELPHI7实现XP菜单风格

    在DELPHI7中不使用任何第三方控件,实现放在工具栏上可拖动的XP风格菜单 今天有点空闲时间,顺便写点东西,不是什么深奥的东西,但实用,对于不想第三方控件但又想加点效果的朋友可能有点用.实现的效果如图:  步骤一:把Win32面板上把CoolBar组件加到窗体上 步骤二:把Additional面板

    2024年02月06日
    浏览(26)
  • Delphi7 ODAC控件连接Oracle RAC

    Direct mode does not support RAC.YOU can connect only to one fixed server in RAC. ODAC 控件中的Direct模式不支持Oracle RAC,只能够链接一个确定的RAC实例。 如果要使用ODAC控件连接Oracle RAC,则需要Oracel安装客户端,并且不使用Direct模式, 链接方式与ADO连接Oracle一致。 根据说明,安装Oracle客户端,安

    2024年02月11日
    浏览(31)
  • 使用Delphi编写DLL劫持内存补丁

    在有些破解程序时,不能暴力修改程序,修改后,程序就不能正常运行,因为很多程序启动时有自我的校验,但是当程序加载到内存后,在内存中修改相应的地方就可以达到破解的效果。那么怎样在不破坏程序的前提下,达到修改程序呢? 当一个可执行文件运行时,Windows加

    2024年02月15日
    浏览(54)
  • [Python] 如何通过ctypes库来调用C++ 动态库 DLL?

    ctypes是Python的一个外部库,它提供了一种灵活的方式来调用C语言的动态链接库(DLL)或共享库(SO)。通过ctypes,我们可以在Python中直接调用 C语言编写的函数和变量 ,从而实现跨语言的互操作。 ctypes 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模

    2024年01月19日
    浏览(27)
  • Java 调用 WebService 、java调用Soap请求、Java对接soap接口

    工作第一次遇到对接soap接口,觉得有必要记录一下,毕竟踩了不少坑,网上帖子很多但大都不全,也不可能完全满足自己的需求,于是就有了下面的代码: 除了只是借鉴, 注意事项: 1.http://ip:port/xxx/xxx/soap?wsdl有些soap接口,对面是不需要穿?wsdl对接时要问出清 2. httpPost.set

    2024年02月05日
    浏览(35)
  • Delphi 中操作MS SQL Server 返回刚插入的自增ID列值

    在开发数据库的应用的时候,经常需要写入日志,比如某个日志需要记录用户打开程序的时间和用户关闭程序的时间,显然这是两个动作,因为用户打开程序可能需要使用一段时间才会关闭。那么当用户打开程序时,我们首先就需要插入一条日志记录,记录下当前用户打开的

    2024年02月11日
    浏览(32)
  • .NetCore调用Soap接口

    添加服务引用的方式无法满足我请求Soap接口,所以写了个Soap帮助类,使用HttpClient的方式请求接口。 提示:以下是本篇文章正文内容,下面案例可供参考 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 可选的

    2024年02月04日
    浏览(26)
  • WebService SOAP1.1 SOAP1.12 HTTP PSOT方式调用

    Visual Studio 2022 新建WebService项目 创建之后启动运行 设置默认文档即可 经过上面的创建WebService已经创建完成,添加HelloWorld3方法, [WebMethod] public string HelloWorld3(int a, string b) { //var s = a + b; return $\\\"Hello World a+b={a + b}\\\"; } 属性页面如下:  地址加上?wsdl----http://localhost:8012/WebService1

    2024年02月04日
    浏览(27)
  • Delphi解决 openssl DLL 与 Indy 的SSL/TLS 连接问题

    昨天,突然间,我的一个 Delphi 程序无法连接到互联网上的各种WMS服务器。我收到以下错误消息: 使用 SSL 连接时出错。错误 1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本 由于我使用的是最新版本的Indy,根据Delphi Praxis 上的此线程,这种情况不应该发生。事实证明,不知

    2024年02月08日
    浏览(23)
  • Java调用WebService接口,SOAP协议HTTP请求返回XML对象

    Java调用Web service接口SOAP协议HTTP请求,解析返回的XML字符串: 1. 使用Java的HTTP库发送SOAP请求,并接收返回的响应。 可以使用Java的HttpURLConnection、Apache HttpClient等库。 2. 将返回的响应转换为字符串。 3. 解析XML字符串 ,可以使用Java的DOM解析器或者其他第三方库,如JDOM、DOM4J等。

    2024年01月19日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包