首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从C#调用Delphi DLL会产生意外结果

从C#调用Delphi DLL会产生意外结果,这个问题可能是由于两种编程语言之间的数据类型和内存管理方式不同导致的。在调用Delphi DLL时,需要注意以下几点:

  1. 数据类型匹配:C#和Delphi的数据类型有很多不同之处,例如整数类型、字符串类型等。在调用Delphi DLL时,需要确保传递的参数和返回值类型与Delphi代码中定义的类型完全一致。
  2. 内存管理:Delphi和C#使用不同的内存管理方式。在Delphi中,字符串通常使用PChar类型表示,而在C#中则使用string类型。在调用Delphi DLL时,需要注意字符串的传递和释放。
  3. 函数签名:在C#中,需要使用DllImport属性来声明Delphi DLL中的函数。需要注意函数名称、参数类型和返回值类型是否正确。

以下是一个简单的示例,展示了如何在C#中调用Delphi DLL中的函数:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

public class DelphiDLLWrapper
{
    [DllImport("DelphiDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    public static extern int AddNumbers(int a, int b);

    [DllImport("DelphiDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    public static extern IntPtr GetString();

    public static string GetStringFromDelphi()
    {
        IntPtr ptr = GetString();
        string result = Marshal.PtrToStringAnsi(ptr);
        Marshal.FreeCoTaskMem(ptr);
        return result;
    }
}

在上面的示例中,我们使用DllImport属性声明了两个Delphi DLL中的函数:AddNumbers和GetString。其中,AddNumbers函数接受两个整数参数并返回一个整数,GetString函数返回一个PChar类型的字符串。在C#中,我们使用IntPtr类型来表示PChar类型,并使用Marshal.PtrToStringAnsi方法将其转换为C#中的string类型。同时,我们还需要使用Marshal.FreeCoTaskMem方法释放Delphi DLL中分配的内存。

总之,在调用Delphi DLL时,需要注意数据类型和内存管理方式的差异,以及函数签名的正确性。如果仍然遇到意外结果,可以尝试使用诸如Dependency Walker等工具来检查DLL中的函数签名是否正确。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Delphi 语言「建议收藏」

二、Delphi目前的用户人群 Borland公司倒闭后,导致很多Delphi爱好者信心产生动摇,加之Jave和.net兴起,许多开发者纷纷转向,放弃DelphiDelphi用户群体急剧流失。...要知道现在主要用户是老司机,老司机走老路,EXE+DLL,他们要把老系统迁到新工具下,才能去继续按老方法使用Delphi的新功能,开发Android、IOS和Linux,但XE好象一到DLL就不行,这就不能解决老司机们的后顾之忧...Anders Hejlsberg去了微软之后推出了.NET框架,主打语言是C#,无论类库命名还是代码风格都与Delphi很像,C#语法接近C,又不兼容C。...其中C#的类库命名很接近DelphiDelphi程序员转入最为C#比较容易。...项目完成后Java或C#由于解释执行的原因更加健壮,因为大部分问题都可以在编译期发现和解决。而Delphi编写的应用则需要较长的Debug时间,项目进度变慢。

2.2K20

C# 六种方式实现精确计时

(); 操作系统启动到现在所经过的毫秒数,精度为1毫秒,经简单测试发现其实误差在大约在15ms左右 缺点:返回值是uint,最大值是2的32次方,因此如果服务器连续开机大约49天以后,该方法取得的返回值归零...经反编译猜测它可能也是调用的GetTickCount,但是它的返回值是int,而GetTickCount与timeGetTime方法的原型中返回值是DWORD,对应C#中的uint,难道.NET对System.Environment.TickCount...4 调用WIN API中的QueryPerformanceCounter [DllImport("kernel32.dll ")] static extern bool QueryPerformanceCounter...缺点:在一篇文章看到,该API在节能模式的时候结果偏慢,超频模式的时候又偏快,而且用电池和接电源的时候效果还不一样(笔记本) 原文地址:http://delphi.xcjc.net/viewthread.php...精度是ns 在C#中要用该方法必须先建立一个托管C++项目(因为要内嵌汇编),编译成DLLc#调用,有点麻烦。

1.1K30

c#中开发ActiveX的学习笔记

严格意义上讲,c#是不能生成纯正ocx控件的,我们在vs.net中新建项目时,也找不到专门的"ActiveX项目"新建项,最多也只就能新建"类库"得到一个dll而非ocx(因此我们也无法用传统的regsvr32...来注册该dll),但是c#能开发com组件,activeX控件本质上讲跟com是一类技术,所以用c#开发"能够让网页调用的com类库"还是可行的。...,用类似下面这样的代码来本机调用了: 注意:c#定义的public方法,如果想直接让js调用,只能返回string,DateTime,int,double这一类基本值类型,其它返回类型比如array,object...开发的(伪)"ActiveX"控件并非纯正的ocx,所以只能用RegAsm.Exe xxx.dll来进行程序集的注册,这里要注意一点:在开发机上,项目编译后vs.net自动将bin\debug\xxx.dll...调用regasm注册,但在别人机器上就不行了,为了能在调试时模拟其它机器的运行结果,可以在编译后,手动用类似 regAsm.exe D:\MyDoc\ActiveXDemo\output\ActiveXDemo.dll

1.4K50

Delphi中利用SEH屏蔽退出时的Runtime Error

Delphi写的程序,如果在单元的finalization里出现了一些异常操作导致退出时抛出Runtime Error ,规范的处理办法当然是解决这些异常,但是有些特殊的情况下,比如用了很多的第三方控件...做法其实很简单,就是在 END.之前手工调用Halt释放,并且将Halt抛出的错误屏蔽掉,这样做和正常的DELPHI释放过程没有任何区别,因为End.编译后其实就是一句话 Call Halt0,只是VCL...wReason = DLL_PROCESS_DETACH时处理。...xor edx, edx    push ebp   push OFFSET @@safecode   push dword ptr fs:[edx]   mov fs:[edx],esp   //调用...,不会对DELPHI正常释放过程产生影响,所有的释放操作都是和VCL一致的,只是不会把错误显示出来。

87440

VC++编写ActiveX控件

说到跨语言的模块化程序设计,在本文之前发表的一篇《VC++的DLL应用(含Demo演示)》中讲了dll的创建方法,用户可以将一些公用函数放在dll源文件中,然后编译生成一个dll文件,供程序动态加载连接并调用里面的函数...里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)...,而内部传入的参数,则是此事件产生的消息附带信息)。...3.2.2 通过C#调用      其实这个才是重点,因为跨语言调用ActiveX技术最被笔者看好的地方。     ...2) 用C#来使用ActiveX的事件时,事件所产生的数据都包含在Event变量中,只需要用个点运算符就可以取出来了。

3.4K30

sdfsdfsd_dsd cd

,无需此步骤 分发的客户端软件只需一个文件:你的客户端程序 服务器和客户端无需Midas.dll,也不需要注册regsvr32 Midas.dll,看来Delphi2010的datasnap抛弃使用COM...另外,经过测试,如果服务器上有TCP死连接,那么服务程序连接数据库,也产生那个一个死连接。这样的话,给数据库服务器也造成威胁。所以,服务器程序编写的好坏,直接影响系统的稳定性!...当该TCP结束后,delphi编写的服务程序自动结束和数据库的连接。...如果客户端调用服务器数据频率低,这种方法很不错,节约很多内存。 3. Server 说明:服务器对所有客户端连接使用一个实例,不是线程安全的。...所以要自己控制客户端并发调用的问题(可以使用互斥、原子量等方法),让客户端的调用排成一队使用服务器资源。 适用环境:这个设置不是线程安全的!!

2K10

C#嵌入x86汇编——一个GPIO接口的实现

厂家拿到接口手册一看,居然是汇编直接操作端口,基本上是IN/OUT指令了。接口很简单,计算位移,读取;计算位移,写入。...这种接口,常见有四种办法,分别是四种语言实现,一是直接写ASM,不过要公开给C#做的应用程序调用,很不容易,另外三种是C/C++/Delphi嵌入汇编,倒是问题不大。...但是我甚至想省掉这个接口DLL,于是有了第六种办法:C#嵌入x86汇编。 C#是没办法像C/C++/Delphi那样直接嵌入x86汇编的,所以需要做点手脚。...(不明白这一句话的可以跳过,或者去看雪论坛) 但是显然要在C#代码里面这么做很不现实,即使用C/C++编译得到obj,C#也没办法链接这个obj。...这个我们是不能像C/C++/Delphi那样直接写汇编指令的,所以得走点弯路。 我的做法是用OD随便打开一个程序,在上面直接写汇编代码,然后把汇编的十六进制复制出来,放到C#代码中。

1.9K70

Python For D

Python For Delphi搭建了Delphi和强大的脚本语言Python的桥梁,使用起来非常方便,让Delphi华丽的界面配合Python强大、简洁、稳定的后台逻辑处理能力,让应用程序模块清晰、...版本 Python For Delphi支持的Python版本为2.3,而最新最稳定的Python是2.4,使用时会提示找不到python23.dll的错误。...OnPathInitialization OnPathInitialization是TPythonEngine设置Python路径的时候调用的事件,但有时却不调用,怎么回事呢?...原来TPythonEngine在初始化的时候首先查找注册表中有没有对应的路径设置信息,如果有,则直接注册表读取而不再执行OnPathInitialization,如TPythonEngine的RegVersion...3、 安装python24.dll到系统目录,如c:/winnt/system32。

1.2K20

java加壳工具_加壳工具 – virbox加密空间站 – OSCHINA – 中文开源技术交流社区

Virbox Protector Standalone 加壳工具可直接对dll文件进行加壳,防止代码反编译,更安全,更方便。...特点 多种加密策略:代码虚拟化、高级混淆、智能压缩 性能分析:智能分析引擎,一键分析各个函数模块调用的次数 资源加密:可保护Unity、UE4开发的软件中资源被提取 支持多种开发语言:多种开发语言加壳支持...源码级保护:保护到汇编级别,c#保护IL级别 多平台支持:支持加密windows、Linux及Mac程序。...免费更新:免费版本升级 加壳效果对比 加壳前后反编译效果 Net程序加密前后对比 支持的语言及二进制文件 .net、PE、C#、java、arx、vb、pb、vc、delphi、Unity3D、使用...IL2CPP编译的unity3D、C++、bcb、C#和com组件、macho可执行程序、So库、OCX控件、Exec(可执行文件格式) 产品网址:http://shell.virbox.com 发布者

1.1K10

逆向工厂(一):hello world开始

需要说明的是,上面产生的程序文件是存储在硬盘(外存)里的二进制数据,当你双击程序后,windows系统根据后缀名进行注册表查找相应的启动程序,这里我们编译出的是以exe后缀的可执行程序,则系统对程序进行运行...为了应对这种尴尬局面,一些编辑软件定期自动保存新数据至硬盘上,以防意外丢失数据的情况发生。...4、还原非开源项目 当你想模仿某优秀软件实现某功能时,发现该软件并未开源,而又很难其他渠道获取该软件的具体技术细节,那么逆向也许帮你敲开思想的大门。...下面我们简单对比c++和c#程序反汇编后得到的代码: ? ? 图1是c++程序反汇编结果,图2为.net程序反汇编结果,两者功能都只是打印一句话。...还有__fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容: 1、函数参数的压栈顺序 2、由调用者还是被调用者把参数弹出栈 3、产生函数修饰名的方法

2.4K80

CefSharp基于.Net Framework 4.0 框架编译

中抽离,所以4.0种的Type并没有GetTypeInfo的方法 解决办法:4.0访问Type的BaseType、IsGenericType等属性,直接Type对象调用即可,即如下的形式: Type...C#发展至今,已经最初的1.0到了5.0版本: 1.0版本 - 基本C#语法。 2.0版本 - 泛型的支持,CLR进行了升级,从根本上支持了运行时泛型。...CefSharp.Core CefSharp.Core是一个C的库,但是由于该C库里面调用了一些C#代码,所以跟.Net Framework版本出现了相关性。...编译该项目,不出意外,编译成功~ 至此,跟.NET Framework绑定的代码已经全部编译通过,本来到此步骤,我们的编译工作已经完成了,但是官方提供了Example让我们可以调用看看样例,本人索性把Example...(C#) CefSharp.WinForms(C#

30110

测试人员代码分析5步法

比如,驱动层代码出问题“蓝屏”,应用层出问题“crash”、"无反应",脚本出问题,脚本挂掉,用户侧基本无感知。...2、当前模块调用了哪些模块:在该模块的工程文件中,搜索和分析和其他模块发生调用关系的关键词,这里的关键词一般是加载函数的名字、文件后缀名等,即可找到该模块调用了哪些模块。...)会调用dllTest.dll。...dllCall.exe会通过LoadLibrary调用dllTest.dll这个动态库。 ? dllCall.exe会通过CoCreateInstance调用dllCom.dll等动态库。 ?...UnderStand集成了代码编辑器、代码跟踪器和代码分析器,支持C/C++/C#, Ada, Java, FORTRAN, Delphi和Jovial等语言,并且具有强大的界面,能将分析结果以图表、图形等形式呈现给大家

1.3K100

443视频看完编程语言排行榜15年沉浮:Python这样上位

将时间定位到2006年1月1日到2006年12月31日,在必应中搜索C#语言,搜索得到的结果如下: ? ?...站在后人的角度看当时人们对于C#语言的理解还挺有意思的,2006年人们对于C#语言还是充满了疑问,产生C#与C语言的区别,C#.NET的前景如何诸如此类的问题,同样的在百度搜索引擎中输入C#语言得到的结果如下...08年,汶川大地震、北京奥运等重大事件促进网络媒体提升主流媒体价值,同时中国网民跃居世界第一,虽然受到金融危机的影响,互联网的浪潮已经是大势所趋。...、金融分析到生物信息、社会网络分析到自然语言处理、各种数据库各种语言接口到高性能计算模型,可以说功能十分齐全。...别急,时间告诉我们答案。 10 Python终得桂冠 2018年2月到5月,使用Python语言的人数不断增多,大有赶上Java的趋势。 ?

1.6K82

WinCE中解决“图片采集及压缩”问题的开发历程

虽然那个DLL驱动可以供C#调用,但是看那个驱动DLL的方法,在使用提取数据的那个函数的时候,必需要设置内核模式,而这个只能用C++来做,因为需要引用一个头文件中的某个函数,显然C#是没有头文件这个概念的...于是这个时候的计划就是,用C++来写DLL程序,将致远公司提供的硬件层的驱动再封装一遍(把那个内核模式的设置函数封装进去),然后提取出图片数据,然后再用C#调用得到图片数据,保存到一个BYTE数组中,然后通过...第二阶段:用C#程序和C++的DLL产生数据交互     用C++写的DLL可以提取到图片数据了,而且已经在工控板上的存储盘上保存了BMP位图文件。...这个时候,想办法用C#主程序来承接这些数据,这个时候,就直接调用DLL中的函数,生成文件,然后此函数返回文件路径,C#程序中得到了文件路径,然后再读取文件,然后GPRS发送位图数据流。...以为可以直接往WinCE下移植了,但是移植的时候,发现WinCE下的C#调用DLL的时候,设置传值编码方式的选项中,没有Ansi选项,于是这就表示不能使用StringBuilder来进行数据承接了,否则承接也是乱码

1.2K20

【vbs】vbs写ini文件

AI可以自由发挥的途径个人认为不算少,它的自定动作(Custom Actions)可以调用exe/js/vbs等东东,但js和vbs我没什么底子,有点畏难情绪,想用自己熟悉的方式来解决问题,就是用c#写个...net程序好像不太地道,再有.net程序首次运行需唤醒CLR,我安装过程求的就是顺畅,为了一个简单任务就要等待CLR启动,即便只是一两秒,也是我不能忍受的;二来,即便我有信心短时间内学会另一门非托管语言(delphi.../c++啥的)来完成这个简单任务,但exe体积也必然大大超过脚本的,这会增大整个安装包的体积,没必要。...只是他娘的,用惯优雅的C#,感觉其它语言就像屎一样,更别说像vbs这种脚本还没什么像样的ISE,总之很佩服主要coding在这些语言上的码农们,完全是受虐。...,故暂存疑),网上高人的办法有二:一是用vbs调用office的vba组件,再操作vba来调用api~真叫一个迂回,同时也感叹高人的智慧呐;二是往系统中扔一个dynwrap.dll就可以调了,话说这dll

1.8K20

Top编程语言的15年沉浮:C#默Java泪,Python终上位!

这个榜单每月发布一次,但是若只关注每月的数据,意义不大,因为有各种因素导致微妙的差异。如果历史的角度来分析,这份榜单就很有意思了。...将时间定位到2006年1月1日到2006年12月31日,在必应中搜索C#语言,搜索得到的结果如下: ? ?...站在后人的角度看当时人们对于C#语言的理解还挺有意思的,2006年人们对于C#语言还是充满了疑问,产生C#与C语言的区别,C#.NET的前景如何诸如此类的问题,同样的在百度搜索引擎中输入C#语言得到的结果如下...、金融分析到生物信息、社会网络分析到自然语言处理、各种数据库各种语言接口到高性能计算模型,可以说功能十分齐全。...上面这幅图,将2001年到2018年,各种语言在TIOBE的排名绘制成了折线图,不难看出,2004年起,Python一路披荆斩棘,走上神坛,而其他语言,Visual Basic、C#等排名有下滑。

86420

Windows桌面程序开发

dll解决),所以就对各个方案做对比做最后的决策(其实还是在纠结用C#.net还是Electron,其它的方案并不考虑)。...Winform、WPF; 基于 Java 的有 AWT、Swing; 基于 Pascal 的 有Delphi; 基于Go语言的有 walk 基于Chromium和Node.js的Electron; 还有国内初露头角的...如果你正在构建新的应用程序,并且你的公司支持使用 .NET Core,那么 .NET Core 是一个不错的选择,总之 .NET Core 越来越好的。...结论 对C++开发不熟 所以C++的方案就不考虑了 Java并不适合桌面开发,其它的语言没用过也暂不考虑 C#的Winform、WPF要想操作其它程序也需要调用DLL 和 用Electron区别不大,所以还是用...Electron来搞了 下一篇再来介绍Electron调用DLL的方式

10.7K10
领券