首页 > 编程语言 >Delphi 调用 c# 动态库-委托实现回调

Delphi 调用 c# 动态库-委托实现回调

时间:2023-04-11 12:11:31浏览次数:27  
标签:调用 string c# Delphi InfWebSocketService C# void public

由于Delphi 的局限性,有时候有的功能可能无法实现,需要借助与其他语言实现,比如C#,这里演示一下Delphi 如何调用C#动态库
  • c# 作为面向对象语言,其中所有的定义和Java 一样,一切皆对象,因此在编写动态链接库的时候需要符合com标准,而委托作为方法的指针,在Delphi 中调用需要把Delphi 中声明的方法地址转换成Ptr 即DWord 传递给C#的动态库,从而实现方法回调。
在C#中 建立一个.netframework 类库

image

image

设置COM

image

image

image

  • C# Code:
  1. 接口
namespace WebSocketLib
{
    public delegate void ProcessDelegate(string msg);
    public interface InfWebSocketService
    {
        string Open(string url);
        void SetDelegate(long ptr);
    }
}

  1. 实现类
using System;
using System.Runtime.InteropServices;
using System.Timers;

namespace WebSocketLib
{
    [ClassInterface(ClassInterfaceType.None)]
    public class ImpWebSocketService : InfWebSocketService
    {
        private ProcessDelegate delProcess = null;
        private Timer timer = new Timer();
        public string Open(string url)
        {
            timer.Interval = 1000;
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
            return $"你确认要打开:{url} 的WebSocket 连接吗?" ;
        }

        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (delProcess != null)
            {
                delProcess($"时间:{DateTime.Now.ToLongTimeString()},心跳检测");
            }
        }

        public void SetDelegate(long ptr)
        {
            IntPtr intPtr = new IntPtr(ptr);
            delProcess = (ProcessDelegate)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(ProcessDelegate));
        }
    }
}

Delphi 导入 ,导入可以编译为控件或者单元文件使用

image

代码下:

unit uWebSocketClientDemo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnOpen: TButton;
    Memo1: TMemo;
    procedure btnOpenClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses ComObj,WebSocketLib_TLB;  //引入导入的文件WebSocketLib_TLB  ComObj 可以不用

var
  client:InfWebSocketService;
procedure callback(s:PAnsiChar);stdcall;  //注意,这里的参数一定要使用PAnsichar 指针字符串,不要用string
begin
  Form1.Memo1.Lines.Add(s);
end;
procedure TForm1.btnOpenClick(Sender: TObject);
var
  inf:InfWebSocketService;
  s:string;
begin
  inf:=CoImpWebSocketService.Create();
  inf.SetDelegate(dword(@callback));
  s:=inf.Open('Delphi 7');
  ShowMessage(s);
end;



end.

效果:

image

标签:调用,string,c#,Delphi,InfWebSocketService,C#,void,public
From: https://www.cnblogs.com/sundh1981/p/17305811.html

相关文章

  • macOS Monterey 12.6.5 (21G531) 正式版发布,ISO、IPSW、PKG 下载
    本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。2023年4月10日(北京时间11日凌晨),Apple为那些无法更新macOSVentura的旧Mac发布了macOSBig......
  • 差分数组-leetcode1094
    车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)给定整数 capacity 和一个数组 trips , trip[i]=[numPassengersi,fromi,toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位......
  • css强制换行 css强制不换行的css方法
    以前总结过Div的换行和不换行的css写法。但对于表格单元格只知道一个属性nowrap可以使其不换行。近日有此需要,但发现加上nowrap在某些情况下还是会换行!无奈,没有一个强制不换行的方法吗?baidu了一下,令俺非常欣慰,还真的找到了办法,问题解决了。用CSS实现表格单元格数据自动换行或不......
  • AIGC爆火的背后需要掌握的基础原理
    最近AIGC和大模型的大火让视频行业的老板们异常兴奋,以前制作一个视频需要经历文案、配音、画面、出镜等复杂流程,现在应用生成式AI产品自动生成文案脚本,再使用一键生成视频(TTV技术)功能,一天可以完成50条视频产出。人工智能如此降本提效,部分行业的从业者面临职业挑战。AI绘画,AI写作,AI......
  • A537CL1化学成分、A537CL1执行标准、A537CL1力学性能
    一、A537CL1钢板简介:A537CL1钢板归属于钢板中的一大类,锅炉容器钢板之一。A537CL1钢板执行的是美国标准,所以也是美标的压力容器锅炉钢板。A537CL1钢板执行标准:执行ASTM标准(美标)。二、A537CL1钢板化学成分:CSiMnPSNiCrMoCuNbVTiAltB≤0.240.15~0.51~1.6≤0.025≤0.025≤0.25≤0.25≤0......
  • 在「机器人领域」使用ChatGPT提高生产力
    以下文章来源于空中机器人前沿 ,作者小米编辑:一点人工一点智能原文:在「机器人领域」使用ChatGPT提高生产力最近几个月,ChatGPT大火,它是OpenAI于去年11月底推出的人工智能聊天机器人程序,已经成为了历史上增长最快的消费者应用程序[1]。毫无疑问,ChatGPT受到了各个行业的广泛关注。其......
  • 【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”
    摘要:华为云DTSE团队出品云原生改造指南,助力轻松实践OCP上云。本文分享自华为云社区《【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”》,作者:华为云社区精选。OpenStack、Docker、K8S、Hadoop……这些都是开发者耳熟能详的开源技术。开源技术的应用,正不断推动新兴技术和产业......
  • 【服务器数据恢复】 重装系统导致EMC存储xfs文件系统分区丢失的数据恢复案例
    服务器数据恢复环境:EMC某型号存储,20块磁盘组建raid5磁盘阵列,划分2个lun。服务器故障:管理员执行重装系统操作后发现分区发生改变,原先的sdc3分区丢失,该分区采用xfs文件系统,存储了公司重要业务信息,急需恢复该分区数据。服务器数据恢复过程:1、将故障存储中所有磁盘编号后取出,将所......
  • 在 Rainbond 上使用在线知识库系统zyplayer-doc
    zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,提供在线化的知识库管理功能,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,可以完全以内网的方式来部署使用它。当然也可以将其作为企业产品的说明文档来使用,支持一键将整个空间的内容开放到互联网,并提供有不......
  • 使用ECLIPSE时弹出中文帮助
    (原创)使用ECLIPSE时弹出中文帮助1 在http://gceclub.sun.com.cn/download/Java_Docs/html_zh_CN.zip官方的下载JDK中文API2把它解压在自己的电脑上,如:F:\JAVAAPI1.5html\html\zh_CN\api(不要有中文路径)(ps:好像可以有中文)3打开ECLIPSE的window--->Preferences--->java--......