分享一次C#调用Delphi编写Dll程序
1.前言:
最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C#通过调用Delphi编写好的Dll通过C#中的DllImport进行数据的加解密,其实原本是很简单的一个过程,在中间遇到了一些坑,希望能够分享这次经验,能够避免更多的人踩到这个坑;
2.后续
C#和delphi平台对接的接口
Delphi
有两个方法:
Estr加密,参数1:加密参数,参数2:秘钥
DeStr解密:参数1:解密参数,参数2:秘钥
C#
通过DllImport引用Dll,然后定义好方法和参数,把对应的Dll放到程序生成的Bin目录下
最后传入参数调用方法,原以为到这里就可以结束,接下来就可以写后面的业务逻辑了,
想法很美好,结果有点天真,程序直接执行到调用方法的时候
出现了第一个错误:
关于无法加载DLL"":找不到指定的模块(异常来自HRESULT:0x8007007E)
找到的解决方式是将项目生成里面的目标平台修改成X86,目的是在64位系统上兼容32位的程序,然后也同时将对应的Dll放入到了C:\Windows\System32,C:\Windows\SysWOW64这两个目录下
然后我按照步骤去操作,发现我的项目是网站,不存在目标平台可以去设置,考虑到WebApi那块也需要调用到这个Des加解密,就把代码拷贝了过去进行调试,执行到加密的那段代码的时候,直接VS程序先卡主,然后运行调试状态直接关闭了,try异常都不抛出,有点无奈,找了半天C# DllImport
Dll 执行错误的解决方案,也没有找到,后续为了方便调试就写了一个winfrom窗体程序,然后我一开始是用得vs2015开发网站(因为vs2019运行网站会报错这个报错的过程忽略掉),在调试这个winfrom程序的时候,执行程序到对应的代码可以执行成功,成功加密和解密对应的数据,然后我用vs2015打开这个窗体程序,得到执行失败的结果,这时候更懵了,后面脑子一闪以前在sql报错的时候在系统日志中能够查到对应的记录,我想这种错误应该也能找得到,最后找到那条记录日志错误内容是:
出现了第二个错误:
错误应用程序
w3wp.exe,版本
7.0.6001.18000,时间戳
0x47919413,错误模块
ntdll.dll,版本
6.0.6001.18000,时间戳
0x4791a7a6,异常代码
0xc0000374,错误偏移量
0x000b015d, 进程
ID 0xcc4,应用程序启动时间
0x01cd5de08c54b3ac,然后通过这个一搜索,搜索到了
文章:https://q.cnblogs.com/q/38510
解决方案是用StringBuilder 替换string参数,执行还是报错,从这个结局方案中得到了一点头绪,后续继续找delphi 中Pchar的相关资料,后续通过不断的修改调试,发现在C#中和delphi 中PChar想中相对应的数据类型是IntPtr 然后修改成以下就可以成功了
总结:
以后这种接口对接的问题能够先更多熟悉双方语言基础的一些语法,方便在对接过程中更有效的沟通;
疑问:
为什么在vs2019中调用成功而在Vs2015中却出现了系统级别的日志;
分享一次C#调用Delphi编写Dll程序的更多相关文章
- delphi编写dll心得, 谢谢原作者的分享。转
delphi编写dll心得 1.每个函数体(包括exports和非exports函数)后面加 'stdcall;', 以编写出通用的dll2.exports函数后面必须加'export;'(放在'st ...
- nodejs调用delphi编写的dll
公司的业务需要,nodejs要读取文件版本号. 同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回. delphi代码如下: function GetFileInfo(AP ...
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- 浅谈C++调用C#的DLL程序方法
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服. ...
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- Qt调用Delphi编写的COM组件
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路 起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码 ICom1 = interfa ...
- Delphi 编写DLL动态链接库文件的知识
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
随机推荐
- javascript 实现最简单的阶乘!
<script type='text/javascript'> window.onload = get(5); function get(n){ document.w ...
- 《C Prime Plus》第十节笔记
数组和指针 10.1 数组 10.1.1 初始化数组 标量变量:只储存单个值的变量 创建只读数组,应该用const声明和初始化数组 const int days[] = {1,2,3,5}; 省略方括 ...
- 学习python-20191107
一.导入模块的两种方式 方式1:import 包名.模块名 [ as 别名]方式2:from 包名 import 模块名 from 包名.模块名 import 变量|函数|类 # ...
- django框架进阶-ModelForm组件-长期维护
############################################################ """ 通常在Django项目中,我们编写的大部 ...
- Linux下文件 ~/.bashrc 和 ~/.bash_profile 和 /etc/bashrc 和 /etc/profile 的区别 | 用户登录后加载配置文件的顺序
转自 https://blog.csdn.net/secondjanuary/article/details/9206151 文件说明: /ect/profile 此文件为系统的每个用户设置环境信息, ...
- 吴裕雄--天生自然HTML学习笔记:HTML 表格
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- LVS(注意iptables和selinux的问题)
1.LVS(高负载) LVS(Linux虚拟服务器) Linux Virtual Server LVS集群采用IP负载均和技术和基于内容请求分发技术.调取器具有很好的吞吐率,将请求均衡的转移到不同的服 ...
- Mac下如何使用homebrew
Homebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件. 常用的命令: 搜索软件:brew search 软件名,如brew search wget ...
- Docker学习笔记_04 Rancher的部署安装(编排选用K8S)
原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...
- Spring Security基本原理
近期研究了Spring Security,现进行记录. 首先先进行一个最简单的demo.默认情况下,在Spring Boot里,如果在classpath下面有Spring Security相关的jar ...