c#调用delphi开发的dll的指针参数

2020-08-31 C#调用Delphi DLL 使用举例 纯手写来段! 最近想把Delphi写的程序转成C# ,但其中有些数据转有点麻烦,写了个Dll ,供C#调用 1.DelphiDll中获得[整数]址传递参数 Delphi代码如下: procedure getVarInt(var i:Integer);stdcall; procedure getVarInt(var i:Integer); begin inc(i); end; .Net代码: [DllImport(__DLLName, EntryPoint =... 阅读详情

在c#中调用DELPH编写的DLL的函数时出现未将对象引用到实例的错误: delphi编写的dll中函数声明:function DeliverfromEsm(var Smtype, Content,Caller:pchar):integer;

Content:短信内容或报告(若Smtype为即时消息或离线消息,则Content表示短信内容;否则,Content表示返回的状态报告情况);   Content表示返回的状态报告Report结构:     DWORD TaskID; //客户端序列号 TaskID     DWORD MsgID; //客户端序列号 MsgID     char UserNumber[22]; //接收手机号     unsigned char state; //状态     unsigned char ErrCode; //错误代码 我在c#中声明: [DllImport("EsmApi.dll",CharSet  =  CharSet.Ansi,CallingConvention  =  CallingConvention.StdCall)] static extern int DeliverfromEsm(ref string smtype,ref string content,ref string caller); 调用: string smtype=""; string content=""; string caller=""; int reportval=DeliverfromEsm( ref smtype,ref content,ref caller); 出现未将对象引用到实例的错误

以下是解决办法:

声明:

[DllImport("EsmApi.dll",CharSet   =   CharSet.Ansi,CallingConvention   =   CallingConvention.StdCall)]   static extern int DeliverfromEsm(StringBuilder Smtype, IntPtr Content,StringBuilder Caller);//接收短信和report

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]   public struct Report   {    public int TaskID;//4byte    public int MsgID;    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=22)]public string UserNumber;    public byte state;//1byte    public byte ErrCode;   }

程序中处理:

StringBuilder   smtype=   new   StringBuilder(256);//Init   buffer          

    int size = Marshal.SizeOf(typeof(Report));     IntPtr content=Marshal.AllocHGlobal(size);//分配32bytes     StringBuilder   caller=   new   StringBuilder(256);//Init   buffer     int reportval=DeliverfromEsm(  smtype,content, caller);

//字符串时

string smscontent=Marshal.PtrToStringAnsi(content);

//结构体时

Report content1=(Report)Marshal.PtrToStructure(content,typeof(Report));

Marshal.FreeHGlobal(content);//释放

参考了网上的一段代码:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]    public struct VideoCompressorInfo    {        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]        public string szName;        public Int32 dwHandle;    }        [DllImport("DSStream.dll")]        public extern static int DSStream_EnumVideoCompressor(IntPtr pInfo, ref int piVidCompNum);             int num = 0;            DSStream_EnumVideoCompressor(IntPtr.Zero, ref num);            int size = Marshal.SizeOf(typeof(VideoCompressorInfo));            IntPtr structPtr = Marshal.AllocHGlobal(size * num);            DSStream_EnumVideoCompressor(structPtr, ref num);            VideoCompressorInfo[] infos = new VideoCompressorInfo[num];            for (int i = 0; i < num; ++i)            {                infos[i] = (VideoCompressorInfo)Marshal.PtrToStructure((IntPtr)((int)structPtr + i * size), typeof(VideoCompressorInfo));            }            Marshal.FreeHGlobal(structPtr);

c#调用delphi写的dll遇到并解决的问题 c#调用delphi写的dll,需要以一级指针、二级指针作为参数传递。 阅读详情

相关推荐

C# 调用Dll

net平台上,调用dll文件有2种含义1、调用托管dll,即你使用。net平台开发dll,属于托管代码2、调用非托管dll,即传统的dll,一般是C++,VB,DELPHI等等开发出来的,属于非托管代码。从你的意思中看出来你现在是调用托管的dll,方法是 “在解决方案管理器” - “解决方案”(或项目) 中的任意地方, 右键“添加引用”,“浏览”,选择你需要调用dll文件...

weixin_34358092的博客 2241

SDK对接解码器接口调用及Demo使用流程(宇视科技).pdf

SDK对接解码器接口调用及Demo使用流程(宇视科技).pdf

NETDEVSDK_Win64_MFC_V2.1.0.0.zip

基于宇视摄像头sdk用mfc写的demo,实现摄像头视频浏览、下载、抓拍、控制

NETDEVSDK_Win64_V2.5.15.2.zip

宇视NET sdk demo

C#调用Delphidll之详解-完整版_附有可下载Demo

====================================================== 注:本文源代码点此下载 ====================================================== c#调用delphi接口方法,有两种解决办法: 一、将delphi程序编译成一个com组件,然后在c#里引用com组件。 二、非托管调用dep

javazhuanzai的专栏 526

C#调用Delphi dll调用及回调问题注意事项

原文:https://blog.csdn.net/mengzhongren2/article/details/78140930 1.Delphi封装的函数API及定义的函数类型(用于回调)中参数的修饰关键词尽不使用const 2.Delphi封装的函数API及定义的函数类型(用于回调)中参数的修饰关键词使用const,对应C#中申明需带ref 3.Delphi封装的函数API及定义的...

iwilldoitx的博客 1275

C# 调用delphi生成Dll的相关问题

C# 调用Dll是一种很常见的引用方式,最近我刚刚调用Delphi生成的Dll时候发现好几个问题,网上资料也相对较少,所以贴出来备忘。 首先是Delphi 生成的dll具有以下功能,初始化方法Init(),搜索方法UdpSearch(),释放方法Free(),其中搜索方法带有一个回调方法SetSearchReceiveProc(),用来打印搜索到的结果。 首先我们看一下怎么引用DLL

爱T程序员的专栏 571

C#调用DelphiDll传值

//----------------------C#-------------------// private const string dll = "iihFounder.dll"; [DllImport(dll, EntryPoint = "FounderRequestData", SetLastError = true, CharS...

龙七 624

宇视网络设备SDK开发手册_V2.1.0.0.chm

宇视网络设备SDK开发手册,其中包含调用sdk接口实现视频浏览、下载、控制的说明

宇视sdk开发

宇视sdk开发库,有帮助文档和demo,动态链接库,静态库,不含播放库。

宇视视频SDK开发

宇视视频SDK开发包,方便集成开发。里面包含 VC++

C#调用Delphi dll库文件

C#调用Delphi dll库文件,分别用函数和存储过程写的两种方法 在c#2013调试成本DELPHI7写的DLL文件

C#调用dll

起因是因为相机有个手眼标定程序是用C#写的,中间留出来了机器人通信的地方,但是我们的机器人只提供了dll来控制。因此要结合起来的话,想试试通过C#调用dll。 一. C# 中静态调用C++动态链接 1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dll。 2. 在CppDemo.cpp文件中添加这些代码。 extern

Learning by doing 2221

求教,c#如何调用delphi编写的dll中的函数

====================================================== 注:本文源代码点此下载 ====================================================== 求教。        c#如何调用delphi编写的dll中的函数 delphi / windows sdk/api http://www.d

javazhuanzai的专栏 405

C#动态调用非托管dll(转)

尝试着在C#调用以前Delphi写的一些DLL,基本实现动态调用,传入回调函数,及调用带结构数组指针作为参数的函数. 虽然DllImport可以方便的静态调用DLL的函数,但在.net2.0中新增加了一个Marshal.GetDelegateForFunctionPointer 方法,可以将非托管函数指针转换为委托。 有了这个方法就可以用三个Windows API函数即:L...

aiman5818的博客 224

java调用宇视摄像头,实现双向语音

宇视摄像头双向语音 IPC672LR-ADUWKCF40-DT浙江宇视摄像头 IPC&NVR&VMS&显控—浙江宇视科技有限公司 他们官网的SDK包对win10兼容性不行,需要的话需要找宇视的开发人员单独要。 只有宇视单独开发的版本才能双向语音,下面的版本是单独给我的。 NetDEVSDK_Win64_20210906.zip 我将它解压到D:\project\yushi\NetDEVSDK_Win64_20210906 Java部分 第一步,写Java.

gong0585的专栏 3022

宇视SDK对接记录过程

1)NETDEV_Login函数登陆端口一般情况下是80,也有81的情况,因此最好不要硬编码 2)SDK跟服务器之间的通信协议通过抓拍分析,采用的是ONVIF协议进行通信 3)连接采用的是短链接,一般查询结束,下一次查询采用的端口是不一样的 4)SDK没有主动关闭短链接,如果频繁查询连接,会产生大量的TIME_WAIT,耗尽系统的端口资源 5)取流端口是554,非常类似于通过ONVIF进行设备信息交互,RTSP取流方式 6)NETDEV_Login登陆的接口耗时比较久,大概1秒

fengyuzaitu_126_com的博客 2587
上一篇: C#中的参数传递
下一篇: C#实现的根据年月日计算星期几的函数
wei0527
博客等级 码龄25年 13粉丝 39原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值